下載/瀏覽Download

Download Report

Transcript 下載/瀏覽Download

堆積排序法 (Heap Sort)
• 堆積 (heap) 是一棵完整二元樹,且規定堆積中每
一個父親節點的鍵值皆大於等於其兒子節點的鍵
值。
30
25
10
7
3
1
2
5
20
22
完整二元樹調整為堆積
1. 從二元樹的最後一個父親節點至第一個父
親節點(即樹根)逐一作比較。
2. 若父節點比最大子節點小,則彼此交換。
3. 被交換的父親節點,必須重複步驟2的比較,
直到不需交換或已無子節點為止。
範例
• 二元樹若存於陣列a中,則調整成堆積結構的過程如
下:
1
2
4
8
15
3
7
9
5
13
8
11
7
6
10
12
a[1]
8
a[2]
9
a[3]
7
a[4]
13
a[5]
11
a[6]
10
a[7]
12
a[8]
15
範例(續-1)
過 程
1
2
4
8
9
15
5
11
8
6
說 明
7
3
7
10
12
調整 a[4]節點
a[4] < a[8]  a[4] 與 a[8] 交
換
交換後 a[8]無子節點,故停止。
13
1
2
4
8
15
13
9
5
11
8
6
12
10
3
7
7
調整 a[3]節點
a[3] < a[7]  a[3] 與 a[7] 交
換
交換後 a[7]無子節點,故停止。
範例(續-2)
過 程
1
2
4
8
15
13
8
3
12
6
5
10
11
7
9
1
2
4
8
說 明
9
8
13
5
11
15
6
12
10
3
7
7
7
調整 a[2]節點
a[2] < a[4]  a[2] 與 a[4] 交
換
a[4] < a[8]  a[4] 與 a[8] 交
換
交換後a[8]無子節點,故停止。
調整 a[1]節點 (樹根)
a[1] < a[2]  a[1] 與 a[2] 交
換
a[2] < a[4]  a[2] 與 a[4] 交
換
a[4] < a[8]  a[4] 與 a[8] 交
換
堆積排序法的運作步驟
• 假設有n筆資料
1. 將資料視為完整二元樹。
2. 自最後一個父親節點開始 (若有n 個節點,則從
第 [n/2] 個節點開始) 將完整二元樹調整成堆積。
3. 將樹根之資料與尚未排序的最後節點交換,則
最大鍵值已排序好。
4. 若未排序資料只剩一筆,則排序完成,否則調
整樹根節點,使二元樹成為一個堆積,接著重覆
步驟3。
例﹕ 若欲排序的鍵值為26 5 77 1
解:
61 4
利用堆積排序法排序。
將初值 26, 5, 77, 1, 61, 4 視為完整二元樹
26
77
5
1
61
4
[1]
[2]
[3]
[4]
[5]
[6]
26
5
77
1
61
4
例 (續)
pass 1:
77
調整堆積
26
61
4
5
1
4
26
5
[2]
[3]
[4]
[5]
[6]
77
61
26
1
5
4
樹根與最後節點交換
61
1
[1]
77
[1]
[2]
[3]
[4]
[5]
[6]
4
61
26
1
5
77
例 (續)
pass 2:
調整堆積
61
26
5
1
4
[3]
[4]
[5]
[6]
61
5
26
1
4
77
樹根與最後節點交換
26
5
61
[2]
77
4
1
[1]
77
[1]
[2]
[3]
[4]
[5]
[6]
4
5
26
1
61
77
例 (續)
pass 3:
26
調整堆積
4
5
1
61
[3]
[4]
[5]
[6]
26
5
4
1
61
77
樹根與最後節點交換
4
5
61
[2]
77
1
26
[1]
77
[1]
[2]
[3]
[4]
[5]
[6]
1
5
4
26
61
77
例 (續)
pass 4:
5
調整堆積
4
1
26
61
77
4
5
61
[2]
[3]
[4]
[5]
[6]
5
1
4
26
61
77
樹根與最後節點交換
1
26
[1]
77
[1]
[2]
[3]
[4]
[5]
[6]
4
1
5
26
61
77
例 (續)
pass 5:
調整堆積
4
5
1
26
61
[3]
[4]
[5]
[6]
4
1
5
26
61
77
樹根與最後節點交換
5
4
61
[2]
77
1
26
[1]
77
[1]
[2]
[3]
[4]
[5]
[6]
1
4
5
26
61
77
• 排序結果:1 4 5 26 61
77
• 6筆資料要經過5個階段才能完成