堆排序的基本思想以及python實現

2021-10-23 02:41:11 字數 1866 閱讀 1453

堆排序

\mathbf

堆排序堆排序:只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。

堆的定義:n個元素的序列

\,當且僅當滿足以下關係是,稱為堆。

k_i \leqslant k_\\ k_i \leqslant k_\end

k_i \geqslant k_\\ k_i \geqslant k_\end

\right\rfloor

i=1,2,

...,

⌊2n​

⌋若將和此序列對應的二維陣列(即以一維陣列作此序列的儲存結構)看成是乙個完全二叉樹,則堆的含義表明,完全二叉樹中所有非終端節點的值均不大於(或不小於)其左右孩子節點的值。由此,若序列

\是堆,則堆頂元素(或完全二叉樹的根)必為序列中n個元素的最小值(或最大值)。

堆排序的主要思想:在輸出堆頂的最小值(或最大值)之後,使得剩餘的n-1個元素的序列又重建成乙個堆,則得到n個元素中的次小值(或次大值)。如此反覆執行,便能得到乙個有序序列,此過程即為堆排序。

實現堆排序需要解決兩個問題:

1)如何由乙個無序序列建成乙個堆?

2)如何在輸出堆頂元素之後,調整剩餘元素成為乙個新的堆?

例題:假設給定的陣列為[2,1,7,9,5,8],對其進行堆排序。(小頂堆)

基本流程:

1)首先對其進行堆調整。(無序序列建堆)

2)堆篩選

**實現:

def

heapsort

(h):

# 從非葉節點開始調整

i =(len

(h)-1)

//2while i >0:

# 堆篩選函式

heapadjust(h,i,

len(h)-1

) i -=

1# 用於儲存堆排序的結果

result =

# 輸出h[1],並和尾結點交換,並刪除。

j =len(h)-1

while j >1:

# 新增h[1]到result中。1]

)# 交換位置

h[1]

,h[j]

= h[j]

,h[1

]# 刪除尾結點。

h.pop(

)# 堆篩選

heapadjust(h,

1,j-1)

j -=

1# 將h[1]新增到result中1]

)return result

defheapadjust

(h,s,m)

:# 記錄當前節點的值。

rc = h[s]

# 其左孩子節點

j =2* s

while j <= m:

# 如果j# 右孩子

if j < m and h[j]

> h[j+1]

: j +=

1# 判斷當前節點和左右孩子的最小值的大小

# 如果根節點小於其左右孩子,則break。

if rc < h[j]

:break

# 否則,將其左右孩子的最小值賦值給當前節點,繼續調整被破壞的堆結構。

h[s]

= h[j]

s = j

j *=

2# 最後將當前節點的值,賦值給調整後的位置

h[s]

= rc

希爾排序基本思想

基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插人排序 然後,取第二個增量d2 1重複上述的分組和排序,直至所取的增量dt 1 dt t l 2 1 即所有記錄放在同一組中進行直接插入排序為止。該方法實質上...

氣泡排序基本思想

原理 比較兩個相鄰的元素,將值大的元素交換至右端。每次獲得 最大 的數 思路 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一...

氣泡排序的基本思想

1 氣泡排序的基本思想 氣泡排序是交換排序中一種簡單的排序方法。它的基本思想是對所有相鄰記錄的關鍵字值進行比效,如果是逆順 a j a j 1 則將其交換,最終達到有序化 其處理過程為 1 將整個待排序的記錄序列劃分成有序區和無序區,初始狀態有序區為空,無序區包括所有待排序的記錄。2 對無序區從前向...