從第六章開始,我們開始了第二部分排序和排序統計學的學習。
第六章介紹的是堆排序,本章講了以下幾個內容:
1、介紹堆的概念,以最大堆為例
2、保持堆性質的演算法max-heapify
3、建堆的演算法build-max-heap
4、堆排序演算法heapsort
5、優先順序佇列
1、堆
定義:(二叉)堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹中每個結點與陣列中存放該結點值的那個元素對應。樹中每層都是滿的(最後一層可能除外,所以它才可以被視為完整二叉樹)。
表示堆的陣列a是乙個具有兩個屬性的物件:length[a]是陣列中的元素,heap-size[a]是存放在a中的堆的元素的個數。即a[1….length-size[a]]屬於相應的堆,在其後就不屬於堆了,但只要不到a[length[a]],對陣列來說,仍是有效值
堆與樹的簡單比較
高度:1、堆的高度是本節點到葉子節點的最長簡單路徑上邊數目,即從葉往上算
2、樹的高度是從根往下到該結點
3、堆與樹的高度均為θ(lgn)。
2、保持堆的性質
max-heapify演算法,保持最大根性質的關鍵。偽**如下:
max-heapify(a,i)
l ←left(i)
r ←right(i)
if l≤heap-size[a] and a[l]>a[i]
then largest ←l
else largest ←i
if l≤heap-size[a] and a[r]>a[largest]
then largest ←r
if largest≠i
then 交換a[i]與a[largest]
max-heapify(a,largest)
執行時間t(n) ≤t(2n/3)+ θ(1)
tn=o(lgn)=o(h).
3、建堆
我們可以自底向上地呼叫max-heapify來將乙個陣列變成最大堆
build-max-heap(a)
heap-size[a] ←length[a]
for i←length[a]/2 到1 //開始自底向上,從倒數第二層最右端
do max-heapify(a,i)
每次呼叫max-heapify時間為o(lgn),共呼叫o(n)次,故時間為o(nlgn)
4、堆排序演算法
開始時,堆排序演算法先用build-max-heap將陣列構成乙個最大堆,然後根結點與a[n]互換位置。不斷重複該過程,直至堆的大小變為2
heap-sort(a)
build-max-heap(a)
for i ←length[a] 直到2
do 交換a[i]與a[i]
heap-size[a] ←heap-size[a]-1
max-heapify(a,1)
執行時間為o(nlgn)
其中呼叫build-max-heap的時間為o(nlgn)(筆者認為書中的o(n)有誤,)n-1次heap-max-heapify呼叫中每次的時間代價為o(lgn)
5、堆的應用:優先順序佇列
定義:是一種用來維護由一組元素構成的集合s的資料結構,這一組元素中的每個都有關鍵字key。支援以下操作:
1、佇列的最大關鍵字的元素
heap-maxmum(a)
return a[1]
2、去掉並返回最大關鍵字的元素
extract-max(a)
if heap-size[a]<1
then error」堆下溢」
max← a[1]
a[1] ←a[heap-size[a]]
heap-size[a] ←heap-size[a]-1
max-heapify(a,1) //主要把時間花在這裡
return max
3、將元素的關鍵字值增加到k,k值不能小於x原來關鍵字值
increase(a,i,key)
if key
then error」出入關鍵字值太小」
a[i] ←key
while i>1 anda[parent(i)]
do 交換a[i]與a[parent(i)]
i←parent(i)
4、在堆中插入新元素
首先是要加入乙個關鍵字值為-∞的葉子結點來擴充套件堆
insert(a,key)
heap-size[a] ←heap-size[a]+1
heap-size[a] ←負無窮
increase(a, heap-size[a],key)
總結:
最大堆其實就是乙個類似於遞減數列
優先順序的去值、加值、插值執行時間都是o(lgn)
演算法導論學習筆記 第六章 堆排序
第六章 堆排序總結 這章主要講了堆 建堆 堆排序 優先順序佇列等。1.堆 堆可以被視為一顆完全二叉樹,底層用陣列實現。length a 陣列中的元素個數 heap size a 存放在a 中的堆的元素個數 樹的根a 1 給定某個結點的下標i 父節點parent i i 2 左節點left i 2i ...
演算法導論 學習筆記 第六章 堆排序
這一章主要講了兩個點 1.堆排序。2.堆排序的應用 優先順序佇列 堆堆是一種完全二叉樹 不理解 反正是一種樹狀的資料結構了吧。有幾種操作。求左子節點 2i 求右子節點 2i 1 求父節點 i 2 下取整。保持最大堆結構 max heapfiy 建堆 building a heap 然後這些屬性就可以...
《演算法導論》第六章 堆排序 筆記
堆排序不同於歸併排序的是,堆排序具有和插入排序一樣的空間原址性,任何時候都只需要常數個額外的元素空間儲存臨時資料。因此,堆排序是集合了插入排序和歸併排序兩種演算法優點的排序方法。二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素,除了最底層,該樹是完全充滿的,...