DSA 笔记 -> Heap
Heap and Heapsort
(部分内容使用ChatGPT 5.1生成)
Heap(堆)是什么?
Heap 是一种特殊的“几乎完全满”的二叉树(almost perfect binary tree)。
它不仅结构特别,而且还满足一个很重要的性质:堆序性(heap order property)。
Heap 的两个核心特性
- 结构性质:完全二叉树
也被叫做 binary heap,要求:
- 除了最底层,其他每一层都是满的
- 最底层如果不满,必须从左往右依次填满
- 没有缺口(holes)
这使得 堆非常适合用数组实现,因为它的形状很规则。
举例:
对数组中下标为 i 的节点:
- 左孩子在
2*i + 1 - 右孩子在
2*i + 2 - 父节点在
(i−1)/2
holes 的意思:
对于完全二叉树,每一层的节点数是2的层数-1(n-1)次方。
- 第一层
2^(1-1) = 1 - 第二层
2^(2-1) = 2 - 第三层
2^(3-1) = 4
- 堆序性:父节点必须小于或等于子节点(最小堆)
子节点的数值必须大于父节点的数值,这样的最小值永远在根节点(顶端)。
insert()
1 | |
解释关键变量:
hole:当前“洞”的位置(用来“挖坑”往上走)size++:插入前堆有size个元素,新元素先占用A[size]位置,size再加 1
不用担心,因为既然hole能到这个位置,那么之前的数据都窜下去了,给父节点赋到子节点不会丢失内容。
deleteMin()
1 | |
关键变量解释:sid: 实际上循环是 while ((2*hole+1) < size)
1 | |
heapSort()
我们不需要多余的空间来进行排序,一个数组中:

直接给他们归成MaxHeap的形式,来存档。
MaxHeap就是给MinHeap反过来。insert的过程,将第5步的<换为>即可。deleteMin换为deleteMax,然后更换sid为bid,就是给bid赋值过程的判断反向,BREAK也换为>=。
存进去,倒着deleteMax出来,……
1 | |
DSA 笔记 -> Heap
https://blog.zlicdt.top/2025/11/14/algorithm-heap/