排序是計算機科學最基礎也最迷人的課題之一。本文精選七大經典排序算法,從核心思想、步驟邏輯、時空複雜度、適用場景到動態 GIF 演示,構建直觀的算法心智模型,助你面試、教學、工程選型游刃有餘。
| 算法 | 平均時間 | 最差時間 | 空間 | 穩定性 | 核心思想 |
|---|---|---|---|---|---|
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不穩定 | 分治 + 基準分區 |
| 歸併排序 | O(n log n) | O(n log n) | O(n) | 穩定 | 分治 + 合併有序序列 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不穩定 | 堆數據結構 + 選擇 |
| 希爾排序 | O(n^1.3~) | O(n²) | O(1) | 不穩定 | 分組插入 + 遞減增量 |
| 插入排序 | O(n²) | O(n²) | O(1) | 穩定 | 構建有序區 + 插入 |
| 選擇排序 | O(n²) | O(n²) | O(1) | 不穩定 | 選最小 + 交換 |
| 冒泡排序 | O(n²) | O(n²) | O(1) | 穩定 | 相鄰比較 + 交換沉底 |
Tony Hoare 1962 年發明。分治策略:選基準,一趟掃描將數組分為「小於基準」與「大於基準」兩個子區,基準歸位,遞歸處理子區。

典型分治法:遞歸拆分至單元素,再合併兩個有序子數組。合併過程需輔助數組,保證穩定性。

利用大頂堆/小頂堆(完全二叉樹 + 堆序性質)特性:堆頂恆為極值。構建堆 → 反復交換堆頂與末尾元素、縮小堆範圍、下沉調整。

每輪從無序區選出最小元素,與無序區首位交換。雙層循環,交換次數最少(O(n))。

相鄰比較,大者後移(「冒泡」到末尾)。可優化:若某輪無交換則提前終止。

維護前綴有序區,取後續元素在有序區從後向前掃描找位置,移動元素騰位插入。

注:原文插入排序無 GIF,此處展示希爾排序動態圖,希爾為插入排序改進版。
針對插入排序「單步移動效率低」痛點,引入 增量序列(Gap):將數組按間隔分組,各組內部插入排序,逐步縮小 Gap 至 1。利用「部分有序時插入排序極快」特性,實現亞 O(n²) 效率。
Arrays.sort() (雙軸快排) / Collections.sort() (TimSort 歸併改進)。排序算法是算法思想的縮影:分治、貪心、數據結構、時空權衡。建議親手實現一次七大算法,並用可視化工具觀察數據流動,方能內化為直覺。