您的位置:首页 > 理论基础 > 数据结构算法

数据结构-堆

2016-04-08 17:39 281 查看
堆最重要的性质就是儿子的值一定不小于父亲的值。除此之外,树的节点是按从上到下、从左到右的顺序紧凑排列的。

在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提升直到没有大小颠倒为止。

从堆中删除最小值时,首先把堆的最后一个节点的数值复制到根节点上,并且删除最后一个节点。然后不断向下交换直到没有大小颠倒为止。在向下交换的过程中,如果有2个儿子,那么选择数值较小的儿子(如果儿子比自己小的话)进行交换。

int heap[MAX_N];
int 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[b] < heap[a]) {
a = b;
}

//如果已经没有大小颠倒则退出
if (heap[a] >= x) {
break;
}

//把儿子的数值提上来
heap[i] = heap[a];
i = a;
}

heap[i] = x;

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: