堆排序的python實現

2021-09-01 03:01:25 字數 1339 閱讀 7156

如圖所示,堆類似於一棵二叉樹,每個節點最多有兩個子結點,根據堆的特點,又分為大頂堆和小頂堆。對於大頂堆,每個結點的值均大於其子結點的值,小頂推則恰恰相反,每個結點的值均小於其子結點的值。

而對排序結構雖然類似於二叉樹,不過確是在列表結構上實現排序的,當結點 i 存在子結點時,其左子結點的索引必定為2i,其右結點的索引則必定為2i+1,根據這個,我們便能在列表的基礎上實現排序。

對於堆排序的原理,根據演算法導論的介紹,分為三個部分。

第一部分:維護堆的性質

堆的性質就是每個結點均大於或小於其子結點的值,這裡以大頂堆為例,我們檢查堆中某個結點,當發現有子結點的值大於它本身,我們將置換這兩個值,然後再處理它的子結點。

def maxheap(a,i):

a=2*i

b=a+1

l=len(a)

if aa[i]:

largest=a

else:

largest=i

if ba[largest]:

largest=b

if largest!=i:

a[i],a[largest]=a[largest],a[i]

maxheap(a,largest)

return a

第二部分:建立大頂堆由於頂堆類似於二叉樹,所以其葉子結點的開始索引必定是i//2+1,因此存在子結點的結點時從第乙個到第i//2,這時只要保證從i//2到1的結點均滿足大頂堆的條件,就可以說明整個列表時大頂堆結構。

def build(a):

l=len(a)

for i in range(l//2,0,-1):

maxheap(a,i)

第三部分:堆排序當建立好乙個大頂堆時,堆頂第乙個資料必然是最大值,這時將堆頂元素與末尾元素調換,則堆尾已排好序,前面n-1個元素組成新的堆,這時將在堆頂剛調換元素進行保持大頂堆操作,即呼叫maxheap(a[:n-1],1)

,然後堆頂元素下沉,新的最大值變為堆頂,再次調換堆頂元素。依次類推,經過n-1輪變換,實現排序。

def heapsort(a):

a.insert(0,0) #由於2*0沒有意義,則需要在列表a[0]處填充乙個值

build(a)

for i in range(len(a)-1,1,-1):

a[1],a[i]=a[i],a[1]

a[:i]=maxheap(a[:i],1)

return a[1:]

堆排序的Python實現

堆排序主要包含兩個部分 堆建立和堆調整。以下是最大堆 def max heapify heap,heapsize,root 對乙個父節點及其左右孩子節點調整 heap list heapsize 做陣列最大限制,root 根節點位置 left 2 root 1 注意此處下標從0開始,下標為1開始時,...

堆排序的python實現

def max heapify heap,heapsize,root left 2 root 1 right left 1 larger root if left heapsize and heap larger heap left larger left if right heapsize and...

Python實現堆排序

usr bin env python coding utf 8 堆排序 class heap object 求給定下標i的父節點下標 defparent self,i if i 2 0 return i 2 1 else return i 2 求給定下標i的左孩子下標 defleft self,i ...