將陣列視為 N 個長度 1 的有序子序列,兩兩合併 → 長度 2/1 有序子序列 → 重複直到整個陣列有序。
初始: [49] [38] [65] [97] [76] [13] [27]
第1輪: [38 49] [65 97] [13 76] [27]
第2輪: [38 49 65 97] [13 27 76]
第3輪: [13 27 38 49 65 76 97]
for (int i = 0; i < n-1; i++)
if (a[i] > a[i+1]) swap(a[i], a[i+1]);
每輪結束最大值固定在最後,下一輪範圍縮減 1。
for (int i = 0; i < n-1; i++) {
int minIdx = i;
for (int j = i+1; j < n; j++)
if (a[j] < a[minIdx]) minIdx = j;
swap(a[i], a[minIdx]);
}
for (int i = 1; i < n; i++) {
int key = a[i], j = i-1;
while (j >= 0 && a[j] > key) {
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
int i = 0, j = n-1, pivot = a[0];
while (i < j) {
while (i < j && a[j] >= pivot) j--;
if (i < j) a[i++] = a[j];
while (i < j && a[i] <= pivot) i++;
if (i < j) a[j--] = a[i];
}
a[i] = pivot; // 基準歸位
遞歸處理左、右兩部分。
| 算法 | 平均時間 | 最壞時間 | 空間 | 穩定 | 適用場景 |
|---|---|---|---|---|---|
| 合併排序 | O(N log N) | O(N log N) | O(N) | ✅ | 大數據、外部排序、需穩定 |
| 快速排序 | O(N log N) | O(N²) | O(log N) | ❌ | 通用內部排序、記憶體受限 |
| 插入排序 | O(N²) | O(N²) | O(1) | ✅ | 小陣列、近乎有序、線上排序 |
| 選擇排序 | O(N²) | O(N²) | O(1) | ❌ | 教學、寫入成本高(交換少) |
| 冒泡排序 | O(N²) | O(N²) | O(1) | ✅ | 教學、極小陣列、檢測已排序 |
Arrays.sort() / Collections.sort()(TimSort:合併+插入混合,O(N log N)、穩定)。