最小堆:所有父亲节点的值都小于儿子节点。
插入操作:首先在末尾添加元素,再不断向上(父亲节点)调整位置
删除操作:把末尾的元素值赋给根,并且删除末尾项,并且从根向下(儿子节点)不断调整位置。
最大堆与最小堆类似。操作反过来即可。
代码:
const int MAXN = 1010;
int heap[MAXN], sz = 0;
void push(int x)
{
int i = sz++;
while (i > 0)
{
//父亲节点编号
int p = (i - 1) / 2;
//如果当前父亲节点的值小于x
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 s1 = i * 2 + 1;
int s2 = i * 2 + 2;
//寻找较小的儿子节点
if (heap[s1] > heap[s2])
s1 = s2;
//儿子节点值大于x
if (heap[s1] >= x)
break;
//不断向下交换
heap[i] = heap[s1];
i = s1;
}
//找到合适位置
heap[i] = x;
return ret;
}