111 年 國立政治大學資訊管理學系碩士班科技組《資料結構》
第 I. 題
Consider the following keys: 17, 35, 12, 28, 16, 5, 18, 7, 19, 92, 48, 3, 22, 1
I. Heap-Sort:
a) Construct a Min-Heap of the above keys.
b) Describe an algorithm to sort keys with a min-heap.
c) Show how to apply the algorithm on the constructed min-heap to sort these keys.
登入後即可作答並保存紀錄。
a) Min‑Heap 建構
以 1 為基底陣列索引,依底層至根部自下而上 siftdown:
最終的最小堆(1‑index)
對應二元樹:
1
/ \
7 3
/ \ / \
19 16 5 12
/ \ / \ / \ / \
28 35 92 48 17 22 18
b) Min‑Heap 排序演算法
- 建堆: 的 heapify。
- 重複以下 次
- 輸出根節點(最小值)。
- 將最後一個節點移到根,堆大小 。
- 在根位置 siftdown,維持最小堆性質()。
整體時間 ,空間 (原地)或 (額外輸出陣列)。
c) 應用於本題
第 II. 題
Consider the following keys: 17, 35, 12, 28, 16, 5, 18, 7, 19, 92, 48, 3, 22, 1
II. BST-Sort:
a) Construct an AVL tree of the above keys.
b) Describe an algorithm to sort keys with an AVL tree.
c) Show how to apply the algorithm on the constructed AVL tree to sort these keys.
登入後即可作答並保存紀錄。
a) AVL 樹構造
插入順序依次調整旋轉後得到的平衡樹如下(每個節點後括號內為平衡因子):
17(0)
/ \
5(0) 28(-1)
/ \ / \
3(+1) 12(0) 18(0) 48(0)
/ / \ / \
1(+1) 7(0) 16(0) 35(+1) 92(0)
/
22(0)
b) AVL 排序演算法
- 依次將所有鍵
key插入空 AVL 樹T(每次插入後執行必要的單/雙旋轉,保證O(log n))。 - 完成插入後,以 中序走訪(左子樹 → 根 → 右子樹)遍歷
T,將走訪到的鍵依序輸出,即為遞增序列。
偽代碼:
第 III. 題
Consider the following keys: 17, 35, 12, 28, 16, 5, 18, 7, 19, 92, 48, 3, 22, 1
III. Merge-Sort:
a) Describe the merge sort algorithm.
b) Show how to apply the algorithm to sort the above keys step by step.
登入後即可作答並保存紀錄。
核心觀念
本題考查 Merge Sort(合併排序) 的分治法:
- Divide:將序列反覆分成左右兩半,直到每個子序列只剩一個元素。
- Conquer:單一元素的序列視為已排序。
- Merge:將兩個已排序的子序列,依序合併成一個較大的已排序序列。
合併時,比較左右兩個子序列目前最前面的元素,將較小者放入結果序列,直到其中一邊耗盡,再接上另一邊剩餘元素。
若資料筆數為 ,遞迴式為
因此時間複雜度為
Merge Sort 通常需要 的額外空間;若左右元素相等時優先取左邊元素,則可維持排序的穩定性。
解題方法
原始序列為
先採用由上而下的分治法切割,再由下而上合併。
分割階段
第一次分割
第二次分割
左半部:
右半部:
繼續分割至單一元素
左側:
右側:
合併階段
1. 合併最小子序列
合併 與
比較 與 :
合併 與
比較過程:
- 不成立,取
- 比較 與 ,取
- 剩下
因此:
合併 與
合併 與
合併 與
比較過程:
- 取
- 取
- 取
- 剩下
因此:
2. 合併左半部
合併
逐步比較:
第 IV. 題
Consider the following keys: 17, 35, 12, 28, 16, 5, 18, 7, 19, 92, 48, 3, 22, 1
IV. In-place Quick-Sort:
(20%) Use the first element as a pivot and show how to apply in-place quicksort step by step to sort these keys. Conside these keys initially in the array as below:
[17, 35, 12, 28, 16, 5, 18, 7, 19, 92, 48, 3, 22, 1]
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- Quick-Sort 的分割(partition)程序。
- 以子陣列的第一個元素作為 pivot。
- In-place 操作:直接在原陣列中交換元素,不另建立左右兩個陣列。
- 分割完成後,pivot 左側元素皆小於 pivot,右側元素皆大於 pivot,再遞迴處理左右子陣列。
採用雙指標分割法。設左指標 、右指標 :
- 從右向左尋找小於 pivot 的元素。
- 從左向右尋找大於 pivot 的元素。
- 交換這兩個元素。
- 當 時,將 pivot 與 交換,使 pivot 歸位。
Quick-Sort 平均時間複雜度為 ,最差為 ;此題採用 in-place 分割,因此額外空間主要來自遞迴堆疊,平均為 。
解題方法
原始陣列為:
以下每次皆選取目前子陣列的第一個元素作為 pivot。
第一層分割:pivot = 17
初始:
左指標從 開始,右指標從 開始。
- 找到 , 找到 ,交換:
- 往左找到 , 往右找到 ,交換:
- 往左找到 , 往右找到 ,交換:
此時指標交錯,將 pivot 與 交換:
因此 歸位,陣列分成:
處理左子陣列:
此段 pivot 為 。
- 找到 , 找到 ,交換:
- 指標交錯,將 與 交換:
因此:
處理子陣列:
pivot 為 。
- 找到 , 從右側往左找到 。
- 指標交錯,將 與 交換:
因此 歸位: