数据结构-堆
2016-04-08 17:39
281 查看
堆最重要的性质就是儿子的值一定不小于父亲的值。除此之外,树的节点是按从上到下、从左到右的顺序紧凑排列的。
在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提升直到没有大小颠倒为止。
从堆中删除最小值时,首先把堆的最后一个节点的数值复制到根节点上,并且删除最后一个节点。然后不断向下交换直到没有大小颠倒为止。在向下交换的过程中,如果有2个儿子,那么选择数值较小的儿子(如果儿子比自己小的话)进行交换。
在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提升直到没有大小颠倒为止。
从堆中删除最小值时,首先把堆的最后一个节点的数值复制到根节点上,并且删除最后一个节点。然后不断向下交换直到没有大小颠倒为止。在向下交换的过程中,如果有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; }
相关文章推荐
- 【学习笔记----数据结构05-栈与队列】
- 【学习笔记----数据结构04-单循环链表】
- 位运算-Number of 1 Bits(求一个十进制数字,它的二进制表示中有多少个 1(bit))
- 【学习笔记----数据结构03--线性链表】
- 数组分段查找
- 栈-Min Stack(实现一个栈,用常数级时间找出栈中的最小值)
- 【学习笔记----数据结构01-概述】
- hdu 1506(dp || 单调栈)
- 常用数据结构及类
- HashMap源码注解 之 内部数据结构 Node (三)
- 1、Linux驱动重要的数据结构
- 数据结构学习(1)
- 【学习笔记----数据结构02--线性表】
- SDUT 2116----数据结构实验之链表一:顺序建立链表
- 数据结构与算法——AVL树类的C++实现
- mysql 中decimal数据结构
- 二叉树遍历总结
- 算法与数据结构 - 二叉树
- 【AC自动机】【数据结构】【树】【Aho-Corasick automation】AC自动机理解(入门)
- Java模拟单链表和双端链表数据结构的实例讲解