基本思想:
圖示: (88,85,83,73,72,60,57,48,42,6)
heap sort
平均時間複雜度:o(nlogn)由於每次重新恢復堆的時間複雜度為o(logn),共n - 1次重新恢復堆操作,再加上前面建立堆時n / 2次向下調整,每次調整時間複雜度也為o(logn)。二次操作時間相加還是o(n * logn)。
def
adjust_heap
(lists, i, size)
: lchild =
2* i +
1 rchild =
2* i +
2max
= i if i < size /2:
if lchild < size and lists[lchild]
> lists[
max]
:max
= lchild
if rchild < size and lists[rchild]
> lists[
max]
:max
= rchild
ifmax!= i:
lists[
max]
, lists[i]
= lists[i]
, lists[
max]
adjust_heap(lists,
max, size)
defbuild_heap
(lists, size)
:for i in
range(0
,(size/2)
)[::
-1]:
adjust_heap(lists, i, size)
defheap_sort
(lists)
: size =
len(lists)
build_heap(lists, size)
for i in
range(0
, size)[:
:-1]
: lists[0]
, lists[i]
= lists[i]
, lists[0]
adjust_heap(lists,
0, i)
七 堆排序(Heap Sort)
堆排序是一種樹形選擇排序方法,它的特點是 在排序的過程中,將array 0,n 1 看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大 最小 的元素。若array 0,n 1 表示一顆完全二叉樹的順序儲存模式,則雙親節點指標和孩子結點指...
排序演算法之七 堆排序 Heap Sort
堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。將待排序的元素序列 r1,r2 rn 構建成最大堆,此堆為初始的無序區。關於最大堆的詳細構建過程請點這裡 將最大堆的堆頂元...
排序演算法 7 堆排序(Heap Sort)
堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。7.1 演算法描述 7.2 演示 7.3 實現 var len 因為宣告的多個函式都需要資料長度,所以把len設定成為全域...