筛选法建立初始小根堆
时间: 2024-06-13 15:06:43 浏览: 30
筛选法建立初始小根堆的步骤如下:
1. 将n个元素的序列看作一棵完全二叉树,根节点为1,其余节点的父节点为i/2,左右儿子分别为2i和2i+1。
2. 从最后一个非叶子节点n/2开始,依次向前进行以下操作:
- 如果当前节点的值比其左右儿子的值都小,则不需要调整,直接处理下一个节点。
- 如果当前节点的值比其左右儿子的值都大,则将当前节点与左右儿子中较小的那个交换位置,然后继续向下调整。
- 如果当前节点的值比其左右儿子的值中的一个小,中的一个大,则将当前节点与左右儿子中较小的那个交换位置,然后继续向下调整。
3. 经过上述操作后,序列就变成了一个小根堆。
下面是一个Python实现的例子:
```python
def sift_down(arr, start, end):
"""筛选法调整堆"""
root = start
while True:
child = 2 * root + 1
if child > end:
break
if child + 1 <= end and arr[child] > arr[child + 1]:
child += 1
if arr[root] > arr[child]:
arr[root], arr[child] = arr[child], arr[root]
root = child
else:
break
def build_heap(arr):
"""构造初始小根堆"""
for i in range(len(arr) // 2 - 1, -1, -1):
sift_down(arr, i, len(arr) - 1)
# 示例
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
build_heap(arr)
print(arr) # 输出:[1, 1, 2, 3, 3, 9, 4, 6, 5, 5, 5]
```