1、概念与结构
- 一般堆使用顺序结构的数组来储存数据,堆是一种特殊的二叉树,具有二叉树的特性的同时,还具备的特性
2、堆的性质
- 堆中的某个结点的值总是不大于不小于其父节点的值
- 堆总是一棵完全二叉树
- 对于具有 n 个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的数组顺序对所有结点从 0 开始编号,则对于序号为 i 的结点有:
1、若 i>0 , i 位置结点的双亲序号: (i-1)/2 ; i=0 , i 为根结点编号,⽆双亲结点
2、若 2i+1,左孩⼦序号: 2i+1 , 2i+1>=n 否则⽆左孩⼦
3、 若 2i+2,右孩⼦序号: 2i+2 , 2i+2>=n 否则⽆右孩⼦
3、堆的结构演示
4、堆的实现
(1)堆的初始化

(2)堆的销毁

(3)堆的向上调整算法

- 小堆:使用<
- 大堆:使用>
(4)堆的打印

(5)入堆

- 首先要判断空间是否足够,即判断size和capacity的值是否相等
- 将堆内的arr[php->size]位置赋值为x,并且进行向上调整排序
(6)堆的判空

(7)出堆

- 首先要判断堆是否为空
- 出堆操作只能对堆顶操作
- 最后进行出堆操作
(8)向下调整算法

(9)取堆顶数据

(10)堆排序

此处已经在下面文章中的详细讲解,各位可以跳转阅读
(11)Top-k问题
