排序是演算法入門必修課。本文展示四種針對整型數組的排序實現,從經典冒泡、選擇排序,到利用「統計頻率」的計數排序(線性時間),並演示無臨時變量交換(XOR 交換)技巧。
void bubble_sort(int a[], int n) {
for (int i=0; i a[j+1]) {
a[j] ^= a[j+1];
a[j+1] ^= a[j];
a[j] ^= a[j+1]; // XOR 交換,無需 temp
}
}
時間複雜度 O(n²),穩定,原地排序。XOR 交換避免臨時變量,但現代編譯器優化下 temp 寫法同樣高效且可讀性更好。
void selection_sort(int a[], int n) {
for (int i=0; i a[j]) {
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
}
同為 O(n²),不穩定,交換次數少(最多 n-1 次),適合寫入成本高的存儲介質。
void counting_sort(int a[], int n, int max_val) {
int *cnt = calloc(max_val+1, sizeof(int));
for (int i=0; i
適用於**數值範圍已知且較小**(如 0-100 分數)的整型排序,時間 O(n+k),空間 O(k),穩定。示例中對 10 個 0-100 分數排序。
qsort 封裝)int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
qsort(arr, n, sizeof(int), cmp);
工程實踐中**首選 qsort** 或 C++ std::sort,平均 O(n log n)、高度優化、經過測試。
| 算法 | 時間 | 空間 | 穩定 | 適用場景 |
|---|---|---|---|---|
| 冒泡 | O(n²) | O(1) | 是 | 教學、極小數據、近乎有序 |
| 選擇 | O(n²) | O(1) | 否 | 寫入昂貴、記憶體受限 |
| 插入 | O(n²) | O(1) | 是 | 小規模、近乎有序、在線排序 |
| 計數 | O(n+k) | O(k) | 是 | 整數、範圍小、已知上下界 |
| 快速/歸併/堆 | O(n log n) | O(log n)/O(n)/O(1) | 否/是/否 | 通用大規模排序 |
qsort 內部常做)。Yaroslavskiy 分區)提升快排穩健性。