演算法導論程式11 堆排序演算法(Python)

2021-07-31 23:13:41 字數 1800 閱讀 6937

堆排序演算法: 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 小頂堆 根節點...