堆排序算法(Python版本)

#堆排序的python版本代码
#堆排序的向下调整函数
#大根堆的建立方函数
def sift(li,low,high): #li是指列表,low是指根节点位置,high是指最后一个元素位置
i=low #最开始跟节点的位置
j=2*i+1 #左边下一层孩子节点
tmp=li[low] #把堆顶元素存下来
while j<=high: #只要j位置有节点,有数字便可以一直循环
if j+1<high and li[j+1]>li[j]: #右边孩子有并且右边更大
j=j+1 #把j指向j+1,右边孩子大于左边,指向右边
if li[j]>tmp:
li[i]=li[j]
i=j #往下看一层
j=2*j+1
else: #tmp更大的情况,把tmp放上来
li[i]=tmp #把tmp放到某一级领导的位置上
break
else:
li[i]=tmp #把tmp放在叶子节点上去

#堆排序的算法实现
def heap_sort(li):
'''构造堆'''
n=len(li)
for i in range((n-2)//2,-1,-1):
sift(li,i,n-1)
#以上表示大根堆构造完成
  #挨个吐出来数字
for i in range(n-1,-1,-1): #i是指当前堆的最后一个元素
li[0],li[i]=li[i],li[0]
sift(li,0,i-1) #i-1是新的堆的high
#以上表示吐出来数字的过程

import random
li=[i for i in range(1000)]
random.shuffle(li)
#li=[1,2,3,4,5,4,9,2,1,4,5,6,3,3,6,2]
print(li)
heap_sort(li)
print(li)


#堆排序的内置模块heapq模块即可实现
import heapq #q->是指queue优先队列(先进先出,大的先出,小的先出)
import random

li=list(range(100))
random.shuffle(li)
print(li)

l=1000
heapq.heappush(li,l) #是指往后面添加元素

heapq.heapify(li) #建立堆的函数
print(li)

n=len(li)
for i in range(n):
print(heapq.heappop(li),end=",") #heappop函数可以每次吐出列表剩下的最小的数

原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12411741.html