标签:htm shu bre 子节点 ret else def port class
# 堆排序的向下调整性
# 排序步骤:建堆 交换堆顶元素和最后一个元素 调整使堆重新有序 i的指向前移(i指向最后一个元素)重复2以后的步骤
# 交换步骤将堆中的最大元素移动到了堆的最后位置,排序完成后,得到的是一个升序序列
# 大根堆的排序
# 向下调整
def sift(li,low,high):
"""
:param li:调整的列表
:param low:调整的堆的堆顶元素的位置
:param high:调整的堆的最后一个叶子节点的位置
:return
"""
i = low
j = 2 * i + 1
tmp = li[i]
while j<=high:
# 判断左右两节点,哪个更大,大的为j
j = j+1 if j<high and li[j+1]>li[j] else j
# 判断i和j哪个大,大的放到i的位置,i指向当前j的位置,j指向新的i的下一层
if tmp<li[j]:
li[i] = li[j]
i = j
j = 2 * i + 1
else:
break
li[i] = tmp
def heap_sort(li):
# 建立堆
for i in range(len(li)//2-1,-1,-1):
sift(li,i,len(li)-1)
# 排序
for i in range(len(li)-1,-1,-1):
li[0],li[i] = li[i],li[0]
sift(li,0,i-1)
# 测试
import random
li = []
for i in range(1,100):
li.append(i)
random.shuffle(li)
print("堆排序前:")
print(li)
heap_sort(li)
print("堆排序后:")
print(li)
堆排序思路可参见:
标签:htm shu bre 子节点 ret else def port class
原文地址:https://www.cnblogs.com/shannen/p/12947003.html