堆排序算法(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函數可以每次吐出列表剩下的最小的數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM