实现:
最小堆:用二叉树构造,堆顶为最小元素
- 用数组存储数据;
- 从索引 0 开始存储;
- 对于任意给定的 i 结点:
- 如果该结点有左孩子,左孩子的结点所在的索引为 [2i];
- 如果该结点有右孩子,右孩子的结点所在的索引为 [2i+1];
- 该结点的父亲结点所在的索引为 [i/2]
- 当树构造好之后,从索引 1 开始,将结点与左右孩子比较,若该结点比左右孩子都小,不用交换;继续下一个索引的结点;若当前结点比左右孩子其中一个大,与较小的交换;
shifDown(int k) {
while (2 * k <= count) {
int j = 2 * k;
if (j + 1 <= count && data[j + 1] <= data[j])
j++;
if (data[k] <= data[j])
break;
swap(data[k], data[j]);
k = j;
}
}
-
最小堆主要有2个重要操作:
1.插入操作;
2.取出最小元素; -
插入操作:新来的元素尾插到数组中,它是最后一个叶子结点,与其父亲结点开始比较,把较小的交换上去,也叫 “上浮”操作
//template<typename Item>
shiftUp(int k) {
while (k > 1 && data[k / 2] > data[k])