經典排序演算法 堆排序(python)

2021-08-15 01:12:49 字數 1801 閱讀 3357

堆排序是指利用堆(最大堆、最小堆)這種資料結構所設計的一種排序演算法。其中堆是一種完全二叉樹的結構,並滿足子結點的鍵值或索引總是小於(或者大於)它的父結點。

用最大堆排序的基本思想:堆排序從最大堆的頂部不斷取走堆頂元素放到有序序列中,直到堆的元素被全部取完。

演算法過程:

(1)、建堆:從len/2到第乙個節點0處一直呼叫調整堆的過程,其中len為陣列長度,len/2表示節點深度。

(2)、調整堆:比較節點i和它的孩子節點left(i),right(i),選出三者最大者,如果最大值不是節點i而是它的乙個孩子節點,那便交換節點i和該節點,然後再呼叫調整堆過程,這是乙個遞迴的過程。調整堆的過程時間複雜度與堆的深度有關係,是lgn的操作。

(3)、堆排序:主要利用上面兩個過程進行。首先是根據元素構建堆,然後將堆的根節點取出(一般是與最後乙個節點進行交換),將前面len-1個節點繼續進行堆調整的過程,然後再將根節點取出,這樣一直到所有節點都取出。

def

buildheap

(seq):

length = len(seq)

for i in range(0, int((length / 2)))[::-1]:

adjustheap(seq, i, length)

defadjustheap

(seq, root, length):

lchild = 2 * root + 1

rchild = 2 * root + 2

rootmax = root

if lchild < length and seq[lchild] > seq[rootmax]:

rootmax = lchild

if rchild < length and seq[rchild] > seq[rootmax]:

rootmax = rchild

if rootmax != root:# 如果做了堆調整,則rootmax的值等於左節點或者右節點的,進行對調值操作

seq[rootmax], seq[root] = seq[root], seq[rootmax]

adjustheap(seq, rootmax, length)

defheapsort

(seq):

length = len(seq)

buildheap(seq)#建立初始堆

for i in range(0, length)[::-1]:

seq[0], seq[i] = seq[i], seq[0]#將根節點取出與最後一位做對調

adjustheap(seq, 0, i)#對前面len-1個節點繼續進行堆調整過程

return seq

if __name__ == "__main__":

l = [2, 1]

print(l)

heapsort(l)

print(l)

其中,[::-1]第乙個引數表示起始點包括起始點,第二個引數表示結束點但不包括結束點,最後乙個引數如果為負的話,需要保證第乙個引數大於第二個引數,表示依次遞減逆序,否則會輸出空列表。

只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得檔案有序。

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

時間複雜度為o(nlogn),空間複雜度為o(1),是一種不穩定的排序演算法。

(排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素時,排序前和排序後他們的相對位置不發生變化。)

(建堆的時間複雜度是o(n),調整堆的時間複雜度是lgn,呼叫了n-1次,所以堆排序的時間複雜度是o(nlgn) )

經典演算法 堆排序

堆排序是利用堆的性質來進行排序的乙個演算法。一 堆堆 英語 heap 是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆 斐波那契堆等。堆的定義如下 n個元素的序列當...

Python實現經典排序演算法 堆排序

上次說到了經典演算法選擇排序,感覺是比較簡單的演算法,這一次說一說稍微有點難度的堆排序。堆排序的時間複雜度要明顯優於前面的氣泡排序,插入排序和選擇排序 侷限於n較大時 先來講講堆 二叉堆 是乙個陣列,它可以近似被看作是乙個完全二叉樹。樹上每乙個節點對應乙個元素,除了最底層外,該樹是完全充滿的,而且是...

經典排序演算法 堆排序Heap sort

經典排序演算法 堆排序heap sort 堆排序有點小複雜,分成三塊 第一塊,什麼是堆,什麼是最大堆 第二塊,怎麼將堆調整為最大堆,這部分是重點 第三塊,堆排序介紹 第一塊,什麼是堆,什麼是最大堆 什麼是堆 這裡的堆 二叉堆 指得不是堆疊的那個堆,而是一種資料結構。堆可以視為一棵完全的二叉樹,完全二...