data = [3,5,2,90,33,1,25,32,44,12,55,24,1]
# 调整堆的函数,从底往上调整,每次调整一组父子节点位置
def convert(l, i, n):
j = 2*i + 1
while j<n:
if j+1<n and l[j] < l[j+1]: # 判断i为父节点时,子节点j和j+1的情况
j += 1 # 用j记录大的子节点
if l[i] > l[j]: # 如果父节点i本来就比所有子节点大,则退出循环
break
l[i], l[j] = l[j], l[i] # 否则交换父节点和子节点位置
# 由于j节点被交换过,所以迭代比较交换过的j节点与它的子节点的大小
i = j
j = 2*i + 1
# 初始化堆
def createHerp(l, n):
i = n/2-1
# 从所有的非叶子节点由下往上调整堆
while i >= 0:
convert(l, i, n)
i -= 1
def main(l, length):
# 初始化堆
createHerp(l, length)
i = length-1
while i >= 0:
# 每调整一次堆,把最大值替换到堆的最后面
l[i], l[0] = l[0], l[i]
convert(l, 0, i)
i -= 1
print l
main(data, len(data))
堆排序python实现
最新推荐文章于 2024-02-22 14:56:53 发布