Heap Sort 的原理及Python實現

2021-09-10 08:56:11 字數 3715 閱讀 4292

1.heap表示方法

滿足以下性質的二叉樹binary tree可以成為binary heap

complete tree:所有的層都是完全的,除了最後一層,且最後一層的葉子靠左。

min heap or max heap:根節點是最大值或者最小值,而且這個性質對於任何遞迴得到的子樹都成立。

binary heap通常使用array表示:

根節點在array[0];

array[(i-1)//2]返回父節點,array[2*i+1]返回左孩子樹,array[2*i+2]返回右孩子樹。

binary heap通常使用array表示,對於任意索引i

def

parent

(i):

return

(i-1)//

2def

left

(i):

return

2*i+

1def

right

(i):

return

2*i+

2

2.max-heapifymax heapify是保持max-heap性質的操作,輸入為array a and index i,假設輸入時,以left(i) and right(i)為根節點的子數都滿足最大堆性質,但是以i為根節點的子數不滿足最大堆性質。max heapify函式讓a[i]向下層轉移,進行調整。

def

maxheapify

(array,i)

: l = left(i)

r = right(i)

largest = i

if l<=

len(array)

and array[l]

>array[i]

: largest = l

if r<=

len(array)

and array[r]

>array[i]

: largest = r

if largest != i:

array[largest]

,array[i]

= array[i]

,array[largest]

maxheapify(array,largest)

時間複雜度分析:在乙個以i作為根節點、包含n個節點的子數上執行maxheapify的時間包含:調整largest常數時間,孩子子樹執行maxheapify的時間。由於孩子子數最多有2n/3個節點(這種情況只會發生在最底層節點剛好是 half full 的情況),因此可以描述為以下形式:

t (n

)≤t(

2n/3

)+θ(

1)t(n)\leq t(2n/3)+\theta(1)

t(n)≤t

(2n/

3)+θ

(1)按照公式法可以得到時間複雜為o(lgn)

3.build-max-heap

maxheapify前提條件是以left(i) and right(i)根節點的子數都是滿足最大堆性質的,那麼顯然如果我們從最底層的子數開始,逐漸往上,對每個節點執行maxheapify(array,i)操作,那麼這個堆所有的節點都滿足最大堆性質,變為最大堆。但是,如果我們從最上層開始執行maxheapify,那麼顯然不滿足前提條件。

另外具體從哪個節點開始呢,heap有個性質,對於array[0,1,...,n-1]的陣列,array[(n-1)//2+1:n-1]的節點全是葉節點,而葉節點是不需要maxheapify操作的,所以我們只對array[:(n-1)//2]的元素進行操作:

def

buildmaxheap

(array)

:for i in

reversed

(range((

len(array)-1

)//2+

1)):

maxheapify(array,i)

計算得到buildmaxheap的時間複雜度為o(n),也就是說堆的建立是線性時間,而不是o(nlgn),這是堆相對於普通排序最大的優點之一。

4.heapsort

heapsort的時間複雜度為o(nlgn),而且是就地排序演算法,除輸入陣列只外只占用恆定的記憶體空間,這兼具了insertion sort(就地排序)和merge sort(時間複雜度)的優點。

def

maxheapify

(array,n,i)

: l =

2*i+

1 r =

2*i+

2 largest = i

if l<=n and array[l]

>array[largest]

: largest = l

if r<=n and array[r]

>array[largest]

: largest = r

if largest != i:

array[largest]

,array[i]

= array[i]

,array[largest]

maxheapify(array,n,largest)

defheapsort

(array)

: n =

len(array)

for i in

reversed

(range

(n//2)

):maxheapify(array,n-

1,i)

while n>1:

array[n-1]

,array[0]

= array[0]

,array[n-1]

n -=

1 maxheapify(array,n-1,

0)return array

堆排序 Heap Sort 演算法的實現

堆排序演算法思想非常簡單,先把乙個陣列看成乙個heap,在下面的實現中,我使用的是max heap,也就是說根總是比葉子大。所以我們第一步就是建立max heap。建立完畢以後,很明顯這個heap的root就是最大的,把最大的根放在陣列的最後乙個位置,把陣列長度縮小乙個位置,這樣最大的那個數就不會再...

itemcf的hadoop實現優化 Python

原始資料如下 u1 a,d,b,c u2 a,a,c u3 b,d u4 a,d,c u5 a,b,c 計算公式使用 sim u i u j u i u j 其中 u i u j u i u j u i u j 原始的hadoop實現需要5輪mr,優化後只需要兩輪就可以完成。之前的輪數過多,主要在於...

使用virtualenv建立獨立的Python環境

virtualenv是 python的沙盒環境,主要解決以下問題 yum groupinstall development tools yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel read...