数据结构学习笔记(六)堆-优先队列
来源:互联网 发布:峡山淘宝运营培训 编辑:程序博客网 时间:2024/05/17 01:58
基础知识
什么是堆?为什么要建立堆这种数据结构?堆的实际用处是?(堆排序)
应该采用哪种存储结构来存储堆?
因为要使堆的插入、删除等各种基本操作效率最高,所以采用完全二叉树的形式存储堆。
完全二叉树的一些重要性质:
- 若父节点序号为i,则左儿子序号为2i,右儿子序号为2i+1。
- 若某儿子序号为i,则其父节点序号为[i/2](取整)。
怎样插入元素到堆中呢?
假如是最大堆,删除最大元素即删除根节点,那么就会破坏树的有序性,应该怎样调整呢?
/*优先队列:堆*/#include <cstdio>#include <cstdlib>#include <iostream>#define MAX 1001#define MinNum -10001#define TURE 1using namespace std;typedef int DataType;typedef struct HeapNode *MinHeap;struct HeapNode { DataType *Elements; int size; int capacity;};bool IsFull(MinHeap H) { return (H->size == H->capacity); }bool IsEmpty(MinHeap H) { return (H->size == 0); }MinHeap CreateHeap(int N) { MinHeap H = (MinHeap)malloc(sizeof(struct HeapNode)); H->Elements = (DataType *)malloc((MAX + 1) * sizeof(DataType)); H->size = 0; H->capacity = MAX; H->Elements[0] = MinNum; //作为哨兵 return H;}void Insert(MinHeap H, DataType X) { if (IsFull(H)) return; int i = ++H->size; for (; X <= H->Elements[i / 2]; i = i / 2) { H->Elements[i] = H->Elements[i / 2]; } H->Elements[i] = X; // return TURE;}void PrecDown(MinHeap H, int p) { int Parent, Child; DataType X; X = H->Elements[p]; /* 取出根结点存放的值 */ for (Parent = p; Parent * 2 <= H->size; Parent = Child) { Child = Parent * 2; if ((Child != H->size) && (H->Elements[Child] > H->Elements[Child + 1])) Child++; /* Child指向左右子结点的较xiao者 */ if (X <= H->Elements[Child]) break; /* 找到了合适位置 */ else /* 下滤X */ H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = X;}void BuildHeap(MinHeap H) { int i; for (i = H->size / 2; i > 0; i--) { PrecDown(H, i); }}void PrintHeap(MinHeap H, int M) { int i; for (i = M; H->Elements[i] != H->Elements[1];) { printf("%d ", H->Elements[i]); i = i / 2; }}int main() { int i, X, M, N; int leaf; // int heapNode[MAX]; scanf("%d %d", &N, &M); MinHeap H = CreateHeap(N); for (i = 0; i < N; i++) { scanf("%d", &X); Insert(H, X); } // BuildHeap(H); for (i = 0; i < M; i++) { scanf("%d", &leaf); printf("%d ", H->Elements[leaf]); while (leaf > 1) { leaf = leaf / 2; printf(" %d", H->Elements[leaf]); } printf("\n"); } return 0;}
0 0
- 数据结构学习笔记(六)堆-优先队列
- 数据结构学习笔记(六)优先级队列、堆和左高树
- 数据结构---->优先队列(堆)
- [数据结构].堆(优先队列)
- 《数据结构与算法分析》学习笔记四:优先队列(堆)
- 数据结构笔记(5)优先队列(堆)
- 优先队列(堆)--二叉堆学习笔记
- 数据结构学习——优先队列(堆)的基本概念
- 【数据结构】优先队列,堆
- 数据结构:优先队列--堆
- 优先队列 - 数据结构 (二叉堆)
- 数据结构--优先队列(堆)的实现
- 【数据结构】回顾优先队列(堆)
- 数据结构——优先队列(堆)
- 《数据结构》C++代码 堆(优先队列)
- 数据结构-堆和优先队列
- 数据结构之---优先队列(堆)
- 优先队列(堆)优先级设置笔记
- Socket详解
- uva 1225 Digit Counting
- 在非anctivity类中使用Toast
- DeepLearning(Bengio,ch4)-数值计算
- uva 1586 Molar mass
- 数据结构学习笔记(六)堆-优先队列
- HDU 1074
- 回调函数在android中的使用
- 《LeetBook》leetcode题解(4): Median of Two Sorted Arrays[H]——两个有序数组中值问题
- 逻辑回归
- uva 1585 Score
- Mysql常用语句和案例介绍
- CentOS 7.0 关闭防火墙和selinux
- 简单配置搞定 Nginx + Tomcat + HTTPS