排序演算法是電腦科學中最基礎也最重要的課題之一。從簡單的冒泡排序到複雜的基數排序,每種演算法都有其獨特的適用場景與效能特徵。本文將以 C++ 實現七種經典排序演算法,並透過實際效能測試,深入剖析它們在不同情況下的表現差異。
minheap.h 提供了完整的最小堆模板類,支援插入、刪除最小元素、建堆等核心操作。關鍵方法包括:
FilterDown:自上而下調整堆,維持堆性質FilterUp:自下而上調整堆,用於插入新元素後的修復RemoveMin:移除並返回堆頂最小元素採用雙重迴圈反向掃描,設交換旗標優化:若某趟無交換則提前終止。
將陣列分為已排序與未排序區間,逐個將元素插入有序區間適當位置。
採用雙向掃描分區策略,選取基準值將陣列分為兩部分遞迴排序。
改進的插入排序,按增量分組進行插入排序,增量序列採用 gap = gap/3 + 1。
非比較型排序,適用於已知範圍整數(本例 0-1000),利用輔助陣列統計頻率。
從高位到低位遞迴分桶排序,小區間改用插入排序優化。
測試環境:100,000 個 0-999 亂數整數,執行 40 次取平均。使用 clock() 計時,結果輸出至檔案與控制台。
| 演算法 | 平均時間(秒) | 最小值 | 最大值 | 穩定性 |
|---|---|---|---|---|
| 計數排序 | 0.0031 | 0.0000 | 0.0160 | 極佳 |
| 希爾排序 | 0.0320 | 0.0310 | 0.0470 | 優 |
| 基數排序 | 0.0360 | 0.0160 | 0.0930 | 良 |
| 堆排序 | 0.0372 | 0.0310 | 0.0780 | 良 |
| 快速排序 | 0.0437 | 0.0310 | 0.0620 | 良 |
| 插入排序 | 15.99 | 14.08 | 17.39 | 差 |
| 冒泡排序 | 58.75 | 51.88 | 62.86 | 極差 |
效能測試證明:沒有萬能的排序演算法,只有最適合特定場景的選擇。理解各演算法的時間/空間複雜度、穩定性、資料敏感度,才能在實際工程中做出最佳決策。