冒泡排序與選擇排序是最基礎的 O(n²) 排序,理解其差異是演算法入門關鍵。
核心思想:相鄰元素兩兩比較,大的「冒泡」到右側。每輪將當前最大值移至未排序區末尾。
特性:
優化代碼 (C):
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; // 提前終止
}
}
核心思想:每輪在未排序區找最小值,與區首元素交換。
特性:
[5, 5, 3] 首輪將第一個 5 與 3 交換,導致相等元素順序顛倒。代碼 (C):
void select_sort(int a[], int n) {
for (int i = 0; i < n-1; i++) {
int min = i;
for (int j = i+1; j < n; j++)
if (a[j] < a[min]) min = j;
if (min != i) {
int t = a[i]; a[i] = a[min]; a[min] = t;
}
}
}
| 維度 | 冒泡排序 | 選擇排序 |
|---|---|---|
| 穩定性 | 穩定 | 不穩定 |
| 平均比較次數 | ~n²/2 | ~n²/2 |
| 平均交換次數 | ~n²/4 | ~n |
| 適合場景 | 小規模、近乎有序、需穩定 | 小規模、交換代價高、不需穩定 |
實際工程中,小數據量首選 std::sort (Introsort, O(n log n)),僅教學或極受限環境才手寫 O(n²) 排序。