演算法導論 第六章學習筆記

2021-05-27 02:23:22 字數 2508 閱讀 1692

從第六章開始,我們開始了第二部分排序和排序統計學的學習。

第六章介紹的是堆排序,本章講了以下幾個內容:

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 然後這些屬性就可以...

《演算法導論》第六章 堆排序 筆記

堆排序不同於歸併排序的是,堆排序具有和插入排序一樣的空間原址性,任何時候都只需要常數個額外的元素空間儲存臨時資料。因此,堆排序是集合了插入排序和歸併排序兩種演算法優點的排序方法。二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素,除了最底層,該樹是完全充滿的,...