堆是一种高效的数据结构,广泛应用于优先队列、堆排序、图算法等领域。本文将带你深入理解堆的原理与实现,掌握 C++ 中堆的应用技巧。
一、什么是堆?
堆(Heap)是一种特殊的完全二叉树数据结构,满足以下性质:
- 堆序性:每个节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值
- 完全二叉树:除了最后一层,其他层节点都是满的,且最后一层节点从左向右排列
堆的两种类型:
- 最大堆(大顶堆):父节点值 ≥ 子节点值
- 最小堆(小顶堆):父节点值 ≤ 子节点值
二、堆的存储:数组表示法
堆通常使用数组存储,利用完全二叉树的性质:
- 对于索引
i- 父节点索引:
(i-1)/2 - 左子节点索引:
2*i + 1 - 右子节点索引:
2*i + 2
- 父节点索引:
三、堆的核心操作
1. 上浮(Shift Up)操作
当在堆尾添加新元素后,需要向上调整以维持堆序性
// 最大堆的上浮操作
void shiftUp(vector<int>& heap, int index) {
while (index > 0) {
int parent = (index - 1) / 2;
if (heap[parent] >= heap[index]) break;
swap(heap[parent], heap[index]);
index = parent;
}
}
2. 下沉(Shift Down)操作
当移除堆顶元素后,需要将堆尾元素移到堆顶,并向下调整
// 最大堆的下沉操作
void shiftDown(vector<int>& heap, int size, int index) {
int left = 2 * index + 1;
while (left < size) {
int right = left + 1;
int larger = (right < size && heap[right] > heap[left]) ? right : left;
(heap[index] >= heap[larger]) ;
(heap[index], heap[larger]);
index = larger;
left = * index + ;
}
}

