堆排序演算法: def heapsort(self,a):
開始的時候,利用build_max_heap將輸入陣列a建成最大堆。因為陣列中的最大元素總在根結點a[0]中。通過把它與a[len(a)-1]交換。可以讓元素a[0]放到正確的位置。
這個時候,我們從堆中去掉a中的最後乙個結點。即heap_size-1。其實heap_size起作用的地點主要在函式max_heapify(self,heap_size,a,i)中,就是維護堆的性質中,可以控制堆的大小。然後呼叫max_heapify(heap_size,a,0)這時候已經變成少乙個元素的堆了。即是在元素a[0....len(a)-2]上構建的新的最大堆。
堆排序演算法會不斷重複這個過程。直到堆的大小從len(a)降到1。
import math
class heapsort:
def __init__(self,a_a,a_heap_size):
self.list=a_a
self.heap_size = a_heap_size
def parent(self,i):
return math.floor((i-1)/2)
def left(self,i):
return 2*i+1
def right(self,i):
return 2*i+2
def max_heapify(self,heap_size,a,i):
largest = i
key = a[i]
l = self.left(i)
r = self.right(i)
if la[largest]:
largest = 2*i+1
if ra[largest]:
largest = 2*i+2
a[i]=a[largest]
a[largest]=key
if largest != i:
self.max_heapify(heap_size,a,largest)
return a
def build_max_heap(self,a):
n = math.floor(len(a)/2)-1
heap_size=len(a)
for i in range(n,-1,-1):
a = self.max_heapify(heap_size,a,i)
return a
def heapsort(self,a):
self.build_max_heap(a)
heap_size=len(a)
for i in range(len(a)-1,0,-1):
temp = a[0]
a[0] = a[i]
a[i] = temp
heap_size-=1
self.max_heapify(heap_size,a,0)
執行:
>>> a=[16,4,10,14,7,9,3,2,8,1]
>>> p = heapsort(a,10)
>>> p.heapsort(a)
>>> a
[1, 2, 3, 4, 7, 8, 9, 10, 14, 16]
def heapsort的時間複雜度是o(nlgn)
呼叫build_max_heap的時間複雜度是o(n)
一共n-1次呼叫max_heapify,每次的時間時o(lgn)
所以heapsort的時間複雜度是o(nlgn)
演算法導論 6 堆排序
堆的分類 最大堆性質 高度 對於堆的一些基本操作 偽 描述 實現 max heapify python實現 123 4567 891011 1213 def max heapify i print max heapify i l left i r right i if l heap size and...
演算法導論之五堆排序
堆排序的時間複雜度是,與插入排序相似,堆也具有空間原址性,即任何時候都只需要常數個額外的元素空間儲存臨時資料。1.堆簡介 1 堆是乙個陣列,表示堆的陣列a包括兩個屬性 a.length表示陣列元素的個數,a.heap size表示有多少個堆元素儲存在該陣列中。給定一結點的下標i,可以得到其父結點 左...
演算法導論複習(3) 堆排序
堆排序與歸併排序具有相同的時間複雜度o nlgn 但是在講堆排序之前,先要搞清楚堆排序使用的 二叉堆 二叉堆是乙個陣列,可以被看成近似的完全二叉樹 特點 1.樹上每一節點對應乙個元素,除最底層外,樹是完全充滿的,而且從左到右填充。2.a 大頂堆 根節點的值是大於等於任何子節點的值 b 小頂堆 根節點...