import random
def sift(data, low, high):
"""
:param data: 列表
:param low: 堆的根节点位置
:param high: 堆的高度
:return:
"""
i = low # 最开始指向根的节点
j = 2 * i + 1 # j 最开始左边的节点
tmp = data[low] # 把堆顶存起来
while j <= high: # 只要j位置有数
if j + 1 <= high and data[j] < data[j + 1]: # 如果右边有并且比较大
j += 1 # 指向右节点
if tmp < data[j]:
data[i] = data[j]
i = j # 往下看一层
j = 2 * i + 1
else: # tmp更大,把tmp放在i位置
data[i] = tmp
break
else:
data[i] = tmp # 把tmp放在叶子节点
def heap_sort(data):
n = len(data)
for i in range((n-2) // 2, -1, -1):
sift(data, i, n - 1)
for i in range(n - 1, -1, -1):
data[0], data[i] = data[i], data[0]
sift(data, 0, i - 1)
data = [i for i in range(100)]
random.shuffle(data)
print(data)
heap_sort(data)
print(data)