最基礎的兩種 O(n²) 排序:冒泡排序 (相鄰交換、大元素冒泡到後) 與選擇排序 (每輪選最小、換到前)。
void bubble_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
int swapped = 0;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j+1]) {
int t = a[j]; a[j] = a[j+1]; a[j+1] = t;
swapped = 1;
}
}
if (!swapped) break; // 已有序提前結束
}
}
特點:交換次數多,可優化提前終止。
void selection_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < n; j++)
if (a[j] < a[min_idx]) min_idx = j;
if (min_idx != i) {
int t = a[i]; a[i] = a[min_idx]; a[min_idx] = t;
}
}
}
特點:交換次數少 (最多 n-1 次),無法提前終止。
| 輪次 | 冒泡排序狀態 | 選擇排序狀態 |
|---|---|---|
| 初始 | 7 23 12 4 33 21 2 17 13 9 | 7 23 12 4 33 21 2 17 13 9 |
| 1 | 7 12 4 23 21 2 17 13 9 33 | 2 23 12 4 33 21 7 17 13 9 |
| 2 | 7 4 12 21 2 17 13 9 23 33 | 2 4 12 23 33 21 7 17 13 9 |
| 3 | 4 7 12 2 17 13 9 21 23 33 | 2 4 7 23 33 21 12 17 13 9 |
| ... | ... | ... |
| 結果 | 2 4 7 9 12 13 17 21 23 33 | 2 4 7 9 12 13 17 21 23 33 |
| 指標 | 冒泡排序 | 選擇排序 |
|---|---|---|
| 時間複雜度 | O(n²) | O(n²) |
| 空間複雜度 | O(1) | O(1) |
| 穩定性 | 穩定 | 不穩定 |
| 交換次數 | 多 (O(n²)) | 少 (O(n)) |
| 最佳情況 | O(n) (已有序) | O(n²) |
| 適合場景 | 小數據、近乎有序、教學 | 寫入昂貴存儲(如Flash)、教學 |