contributed by < Randy-Chuang
>
1
先參考 Optimized QuickSort — C Implementation (Non-Recursive) ,以下我把程式碼片段貼入解釋理解過程:
範例顯示外層迴圈第一輪結束後的結果:
外層迴圈跑完第一輪陣列 beg[]
和 end[]
內數值的變化:
陣列 \ index | 0 | 1 | 2 | … |
---|---|---|---|---|
beg[] |
0 0 | 0 4 | 0 | 0 |
end[] |
8 3 | 0 8 | 0 | 0 |
配上範例能發現排序過程中 pivot 變數被用來將大小區段分開後,再改變 beg[]
和 end[]
來紀錄目前 Quick Sort 待排序的區段,以每次迴圈迭代而更改的陣列內容當作分枝來看,就能看出 Quick Sort 遞迴樹的變化,行為與 Iterative DFS 中佇列的控制相同。每跑一次迴圈,當次選用的 pivot 就會被擺到左區塊最後,因此左邊區段最後的元素剛好不用再排序 (圖中紅色標示) 。
但是待排序陣列若是排列特殊會讓遞迴樹產生傾斜,極端情況會讓分配不均的小區段一直保留在 beg[]
和 end[]
陣列前端,造成長度不足以紀錄遞迴樹的分枝,因此作者改善程式碼確保迭代過程中優先處理較小的區段,遞迴樹的高度不會超過 。
(*left)->next
(*left)->next
p->next
list_tail(&left)
list_tail(&right)
延伸問題:
解釋上述程式碼的運作原理,提出改進方案並予以實作。
使用 Linux 核心風格的 List API 改寫上述程式碼,並針對鏈結串列,提出可避免最差狀況的快速排序實作,應設計效能評比的測試程式。
2
延伸問題:
解釋上述程式碼的運作原理,提出改進方案並予以實作。
將改進過的 Timsort 實作整合進 sysprog21/lab0-c,作為另一個有效的排序命令,應設計效能評比的測試程式,確保測試案例符合 Timsort 設想的資料分布樣式。
1
2
3