排序演算法二 堆排序

2021-09-05 11:09:58 字數 1823 閱讀 7645

堆排序的時間複雜度為:o(nlgn)

def

max_heapify

(lst,start,end)

:'''

建立最大堆

'''root = start

while

true

: child =

2* root +

1#左孩子

if child > end:

break

if child +

1<= end and lst[child]

: child +=

1if lst[root]

< lst[child]

: lst[root]

,lst[child]

= lst[child]

,lst[root]

root = child

else

:break

defheap_sort

(lst)

: first =

len(lst)

for start in

range

(first,-1

,-1)

: max_heapify(lst,start,

len(lst)-1

)for end in

range

(len

(lst)-1

,0,-

1): lst[0]

,lst[end]

= lst[end]

,lst[0]

max_heapify(lst,

0,end -1)

return lst

defmain()

: a =[5

,3,17

,10,84

,19,6

,22,9

]print heap_sort(a)

if __name__ ==

'__main__'

: main(

)

堆資料物件是一種陣列物件,它可以看作一顆完全二叉樹。

對於乙個堆陣列a,有兩個屬性:

1.length[a]:表示陣列中元素的個數

2.heap-size[a]:表示陣列a中存放的堆元素的個數

樹的根為a[1],給定某個結點的下標為i,則

父節點:parent[i] : i/2向上取整

左兒子:left[i]:2i

右兒子:right[i]:2i+1

堆分為:最大堆和最小堆

在堆排序中我們使用最大堆,最小堆一般用於構造優先佇列。

堆的乙個節點的高度:該節點到葉節點最長簡單路徑上邊的數目

乙個包含n個元素的堆的高度為o(lgn)

max-heapify用於維護最大堆。他的輸入為乙個陣列a和乙個下標i。在呼叫max-heapify的時候,我們假設left(i)和right(i)的二叉樹都是最大堆,但這時候的a[i]有可能小於他的孩子節點。max-heapify就是讓a[i]的值在最大堆中逐級下降,從而使得根節點為下標i的字數重新遵循最大堆的性質。

時間複雜度:o(lgn)

對n個元素的堆來說,lg(n)也是一棵樹的高度h,max-heapify的時間複雜度是o(h)

排序演算法(二) 堆排序

堆排序 堆是指每個節點值大於 小於其左右節點值的完全二叉樹,根節點一定是堆的所有節點中最大 小節點所在處 節點值大於左右節點值的堆叫大頂堆,根元素為整個堆的最大值。節點值小於左右節點值的堆 叫小頂堆。堆排序過程 1 將無序陣列構建成堆結構。2 將根節點值與最後乙個節點值互換,此時最後乙個節點值最大 ...

演算法二 堆排序

堆排序,其複雜的為nlog n include using namespace std 交換陣列下標為i,j的元素 void swap int tree,int i,int j 堆化,將陣列轉化為大頂堆 如 4,10,3 10,4,3 如果i節點進行了交換,為保證陣列的整個堆結構,必須對交換的節點繼...

排序二 堆排序

子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...