int heap[maxn], sz = 0;
void push(int x)
{
int i = sz++; //自己节点的编号
while (i > 0){
int p = (i - 1) / 2; //父亲节点的编号
if (heap[p] <= x) //假设已经没有大小颠倒则退出
break;
heap[i] = heap[p]; //把父亲节点的数值放下来,而把自己提上去
i = p;
}
heap[i] = x;
}
int pop()
{
int ret = heap[0]; //最小值
int x = heap[--sz]; //要提到根的数值
//从下開始交换
int i = 0;
while (i * 2 + 1 < sz){ //比較儿子的值
int a = i * 2 + 1, b = i * 2 + 2;
if (b < sz && heap[a] < heap[b])
a = b;
if (heap[a] >= x) //假设已经没有大小颠倒则退出
break;
heap[i] = heap[a]; //把儿子的数值提上来
i = a;
}
heap[i] = x;
return ret;
}
实际上,大部分情况下并不须要自己实现堆。比如在C++中,STL里的priority_queue就是当中之中的一个。只是须要注意的是,
priority_queue取出数值时得到的是最大值。
#include <queue>
#include <cstdio>
using namespace std;
int main()
{
priority_queue<int> pque; //声明
pque.push(3); //插入元素
pque.push(5);
pque.push(1);
while (!pque.empty()){ //不断循环直到空为止
printf("%d\n", pque.top()); //获取并删除最大值
pque.pop();
}
return 0;
}