堆是用来处理优先队列的一种方式。
优先队列是指所有存储的信息以某种特定的排序规则排序。
一般的队列是按照来的时间先后排序,而堆是某种特定序列,比如来的年龄最大的站在最前面,或者退伍军人站在最前面,这种指定排序规则的队列就是优先队列。
优先队列的想法很简单,实现方式也很简单,关键的是如何存储,即找一种存储效率高的数据结构才存储堆。
树是堆的最优存储方式,而且是顺序存储的完全二叉树。
递归定义,根节点的左右子树都是堆。
从根节点到任意节点的路径都是有序的!
定义与创建
插入操作
插入数组最后一个位置,然后不断与父节点比较,调整位置。
删除操作
删除以后把最后一个元素移动过来(保证完全二叉树)
然后不断比较,调整顺序。
堆的构建
1.利用插入,不断插入元素,最终形成堆。
复杂度 n*logN,效率并不算优秀。
2.调整
先按有序方式插入数组,然后利用递归,从最后一个有孩子的结点开始调整,调整父节点和子节点,构成堆,直到调整到下标为1(根)的结点,形成堆。
复杂度N,效率优秀。
void MakeHeap(vector<int>&V,int index) {
int parent=index, child, tmp=V[index];
for (; parent * 2 <V.size() - 1; parent = child) {
child = parent * 2;
if (child + 1 <=V.size() - 1 && V[child] > V[child + 1])child++;
if (V[parent] < V[child])break;
else swap(V[parent],V[child]);
}
V[parent] = tmp;
if (index-1 == 0)return;
MakeHeap(V, index - 1);
}