堆排序
\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 對無序區從前向...