這個 Sorter 類不只是排序演算法的代碼集合,更是一個基於 Swing 的可視化教學工具。它將 9 種經典排序演算法(選擇、插入、冒泡、侏儒、希爾、快速、堆、歸並、計數排序)封裝為統一介面,並通過繼承 JPanel 實時繪製數組狀態,讓抽象的演算法過程變得直觀可見。
所有排序方法在關鍵操作(比較、交換、移動)處調用 PAUSE(),該方法通過 Thread.sleep(1) 讓出 CPU 時間片,同時配合獨立繪製線程(runAnimation() 每 30ms 重繪),實現流暢動畫。停止按鈕通過拋出 RuntimeException 中斷排序線程,雖然粗暴但有效。
主程式通過 JComboBox 選擇演算法名稱,利用反射 Sorter.class.getMethod(methodName).invoke() 動態調用對應方法,無需硬編碼 switch-case,極易擴展新演算法。
paintComponent() 將整數數組映射為垂直線條:索引為 X 軸,數值為 Y 軸高度(MAX_VALUE - array[i]),形成直觀的柱狀圖效果。
| 演算法 | 時間複雜度 | 特點與代碼亮點 |
|---|---|---|
| 選擇排序 | O(n²) | 每輪選最小值交換到前端,雙重循環結構清晰 |
| 插入排序 | O(n²) | 將當前元素向前插入有序區,適合近乎有序數據 |
| 冒泡排序 | O(n²) | 相鄰元素比較交換,大值「冒泡」到末尾 |
| 侏儒排序 | O(n²) | 類似插入但單循環,索引前進後退像侏儒走路 |
| 希爾排序 | O(n¹·⁵) | 分組插入排序,間距逐漸縮小,代碼註釋承認實現較簡陋 |
| 快速排序 | O(n log n) | 先打亂數組避免最壞情況,雙指針分區遞歸 |
| 堆排序 | O(n log n) | 兩階段:建最大堆 + 依次取堆頂重建,索引運算精妙 |
| 歸並排序 | O(n log n) | 經典分治 + 輔助數組合併,穩定排序典範 |
| 計數排序 | O(n+k) | 非比較排序,適用非負整數且值域小,注意記憶體風險 |
此框架極適合資料結構課程演示。建議擴展方向:
SwingWorker 替代裸線程,避免 EDT 阻塞原始代碼存在包名大寫(Java.、Javax.)、缺少泛型、異常吞噬等問題,現代化重構時應修正為標準小寫包名、補全泛型、妥善處理異常。