以下是对小根堆的详细说明和总结:
1. 小根堆的定义
- 小根堆是一种完全二叉树,其中每个节点的值都小于或等于其子节点的值。
- 这意味着根节点的值是堆中的最小值。
2. 小根堆的性质
- 完全二叉树:小根堆必须是一棵完全二叉树,即除了最后一层,其他层都是满的,且最后一层的节点尽可能靠左排列。
- 堆序性质:对于任意节点 (i),其值 (val(i)) 满足:
- (val(i) \leq val(2i))(左子节点)。
- (val(i) \leq val(2i+1))(右子节点)。
3. 小根堆的存储
- 小根堆通常用数组存储,数组的下标从 1 开始(或从 0 开始,具体实现可能不同)。
- 对于节点 (i):
- 左子节点的下标为 (2i)。
- 右子节点的下标为 (2i+1)。
- 父节点的下标为 (\lfloor i/2 \rfloor)。
4. 小根堆的操作
- 插入:将新元素插入堆的末尾,然后向上调整(Heapify Up)以维护堆序性质。
- 删除最小值:移除根节点,将最后一个节点移到根位置,然后向下调整(Heapify Down)以维护堆序性质。
- 构建堆:从最后一个非叶子节点开始,依次向下调整,将无序数组构建为小根堆。
5. 小根堆的应用
- 优先队列:小根堆常用于实现优先队列,支持快速获取最小值。
- 堆排序:通过构建小根堆,可以实现堆排序算法。
- Dijkstra算法:在图的最短路径算法中,小根堆用于快速找到当前最小距离的节点。
6. 示例
给定数组 [3, 1, 4, 1, 5, 9, 2, 6]
,构建小根堆的过程如下:
- 初始完全二叉树:
3 / \ 1 4 / \ / \ 1 5 9 2
/
6
```
- 调整后的小根堆:
1 / \ 1 2 / \ / \ 3 5 9 4
/
6
```
- 用数组表示为:
[1, 1, 2, 3, 5, 9, 4, 6]
。
总结
小根堆是一种完全二叉树,其中每个节点的值都小于或等于其子节点的值。
要使用堆排序的筛选方法建立初始小根堆,我们需要按照以下步骤操作:
1. 理解小根堆
- 小根堆是一种完全二叉树,其中每个节点的值都小于或等于其子节点的值。
- 堆排序的筛选方法是从最后一个非叶子节点开始,逐步调整堆结构,使其满足小根堆的性质。
2. 给定数据
数据序列为:15, 9, 7, 8, 20, -1, 7, 4
。
3. 构建完全二叉树
将数据按顺序填充到完全二叉树中:
15
/ \
9 7
/ \ / \
8 20 -1 7
/
4
4. 筛选过程
从最后一个非叶子节点开始,依次向上调整堆结构。
- 步骤1:调整节点
8
(索引 3)。- 比较
8
和其子节点4
,8 > 4
,交换。
15 / \ 9 7 / \ / \ 4 20 -1 7
- 比较
/
8
```
- 步骤2:调整节点
7
(索引 2)。- 比较
7
和其子节点-1
和7
,7 > -1
,交换。
15 / \ 9 -1 / \ / \ 4 20 7 7
- 比较
/
8
```
- 步骤3:调整节点
9
(索引 1)。- 比较
9
和其子节点4
和20
,9 > 4
,交换。
15 / \ 4 -1 / \ / \ 9 20 7 7
- 比较
/
8
```
- 步骤4:调整节点
15
(索引 0)。- 比较
15
和其子节点4
和-1
,15 > -1
,交换。
-1 / \ 4 15 / \ / \ 9 20 7 7
- 比较
/
8
- 交换后,`15` 需要继续向下调整。 - 比较 `15` 和其子节点 `7` 和 `7`,`15 > 7`,交换。
-1
/
4 7
/ \ /
9 20 15 7
/
8
```
5. 最终小根堆
调整后的完全二叉树满足小根堆的性质:
-1
/ \
4 7
/ \ / \
9 20 15 7
/
8
用数组表示为:-1, 4, 7, 9, 20, 15, 7, 8
。
答案
初始小根堆为:-1, 4, 7, 9, 20, 15, 7, 8
。