Chapter 4 - Heap
定义
注意
补充、解释
其他
1 Heap (Priority Queue)
优先队列:出队不是先进的出,而是有优先级
这里我们讨论的优先级为最大/最小,即出队时最大/最小的元素先出队,那么有用数组/链表实现时,出队就要先查找最小/最大元素
如果使用BST,我们将面临一个问题:每次删除最小/最大元素时都只会动最左边/最右边的结点,或插入新元素,慢慢的这棵树就偏了。
而堆的核心操作就是「频繁删除堆顶、插入新元素」,每次删根节点都需要找右子树的最小值来补位,长期操作下来,BST几乎必然会出现单侧倾斜,性能暴跌。
2 Binary Heap
The implementation we will use is known as a binary heap. Its use is so common for priority queue implementations that when the word heap is used without a qualifier, it is generally assumed to be referring to this implementation of the data structure.
It is easy to show that a complete binary tree of height
我们可以用数组来表示完全二叉树,根的下标为1,按层序编号即可。对于下标为
它的parent是
它的左孩子是
它的右孩子是
A min tree is a tree in which the key value in each node is no larger than the key values in its children (if any). A min heap is a complete binary tree that is also a min tree.
2.1 Initialize
1 | //创建堆 |
2.2 Insert
插入的算法:
插到(数组)末尾,然后跟父结点比较,比父结点小,就跟父结点交换然后继续比,直到比父结点大
时间复杂度为完全二叉树的高度
1 | void Insert(MinHeap heap,ElementType item) |
2.3 Delete
最大/最小堆中删除就是删除根结点,但要保证删完依然是最大/最小堆
算法:
- 完全二叉树的最后一个元素跟根交换并删掉最后一个结点(size–),这时根被删除了,但问题是我们要调整这个堆使它依然是最小堆
- 然后最后一个元素(tmp)开始跟左右儿子比,如果tmp比左右儿子中最小的还小,那就待在那里;或者tmp没有左儿子(自然就没有右儿子),也停止
- 如果两个儿子中最小的比tmp小,那么它跟tmp交换,接着重复上一步
1 | /* |

2.4 Other Operations
对于最小堆,如果我们知道某个结点的位置,
要增加它的key,那么增加后要进行下滤(percolate down)
如果要减少它的key,那么减少后要上滤(percolate up)
删除这个结点,那么等于把这个结点的值减小到负无穷,然后上滤,最后这个结点会出现在根的位置,然后对堆进行删除即可。
2.5 Build Heap
给n个元素,如何建立最大堆呢?
- 对n个元素,每个都执行一次插入,时间复杂度为
- 先把n个元素输入进去,形成完全二叉树,再调整位置
我们考虑第2种,借鉴删除的操作
删除是把最后的元素跟根“交换”,然后一层层往下下滤直到找到自己的位置
但这是有前提的,前提是最后的元素成为根后,它的左右子树都是堆(这样,只需跟左右儿子比才是合理的,因为左右子树都是堆说明只有左右儿子可能是当前位置为根的树中最大的了)
所以我们先找到最后一个结点的父结点,这个父结点的左右子树都是堆,因为就一个元素
然后做类似删除的操作(选左右儿子较大的那个,跟父结点比,如果父结点小就交换),再把同层的父结点都调整好,调成堆,再往上层走,这样左右子树又都是堆
1 | //先把n个结点依次输入heap->elements[i] |
最坏情况就是每次都要移元素,即操作了各结点高度之和次
设高度为H,那么一个有H层,根在第0层,第k层
错位相减得
故
故时间复杂度为
2.6 Percolate Down/Percolate Up
我们可以看到,上滤/下滤操作在堆中是很常见的,下面一道练习题。
- Title: Chapter 4 - Heap
- Author: Hare Fuyukawa
- Created at : 2026-04-19 10:02:14
- Updated at : 2026-05-07 20:38:32
- Link: https://redefine.ohevan.com/Data-Structure/DS/FDS-5/
- License: This work is licensed under CC BY-NC-SA 4.0.