二叉堆

入门

二叉堆把树结构压缩进数组,用父子关系维护局部有序。

二叉堆

默认按最大堆展示堆顶和下沉过程。

AlgoAnim · 二叉堆

待机

速度
待机
// 源代码
1void siftDown(vector<int>& heap, int i) {
2    int n = heap.size();
3    while (true) {
4        int left = i * 2 + 1;
5        int right = i * 2 + 2;
6        int largest = i;
7        if (left < n && heap[left] > heap[largest]) largest = left;
8        if (right < n && heap[right] > heap[largest]) largest = right;
9        if (largest == i) break;
10        swap(heap[i], heap[largest]);
11        i = largest;
12    }
13}

复杂度分析

时间 建堆 O(n), 插入/删除 O(log n)
空间 O(n)
最优 取顶 O(1)
最坏 调整 O(log n)

算法讲解

二叉堆通常用数组存储,索引 i 的左右孩子分别位于 2i 和 2i+1(或 2i+1、2i+2)的固定位置。

最大堆要求每个父节点都不小于孩子,最小堆则相反,因此堆顶始终是当前极值。

插入元素时通过上浮恢复堆序,删除堆顶时通过下沉恢复堆序。

它是理解堆排序、优先队列和很多贪心调度题的基础。