码迷,mamicode.com
首页 > 其他好文 > 详细

二叉堆的实现

时间:2014-10-31 17:18:17      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:blog   io   2014   log   amp   ef   as   file   return   


/*
** 二叉堆的实现
** 堆最重要的性质是儿子的值大于等于父亲的值,除此之外,
** 树的节点是按照从上到下,从左到右的顺序紧凑排列的。
**
** 插入:首先在末尾插入,然后不断向上提升直到没有大小颠倒为止。
** 删除:首先把堆的最后一个元素复制到根节点并且删除最后一个
** 	节点。然后不断向下交换直到没有大小颠倒为止。在向下交换过程
** 	中,如果有两个儿子,那么选择数值较小的儿子进行交换。
*/
#include <stdio.h>
#include <string.h>

#define maxn 1000

int heap[maxn], sz = 1; // 1为根节点

void push(int x) {
	int i = sz++;
	while(i > 1) {
		int p = i >> 1; // 父亲节点
		if(heap[p] <= x) break; // 不再颠倒
		heap[i] = heap[p]; // 把父亲节点放下,自己提上去
		i = p;
	}
	heap[i] = x;
}

int top() {
	// ...需要先判断非空
	return heap[1];
}

void pop() { // 出队,同时返回队首元素
	int ret = heap[1];
	int x = heap[--sz]; // 要提到根的数值
	int i = 1;
	while(i * 2 < sz) {
		int a = i << 1; b = i << 1 | 1;
		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;
}


二叉堆的实现

标签:blog   io   2014   log   amp   ef   as   file   return   

原文地址:http://blog.csdn.net/chang_mu/article/details/40657651

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!