void Dir_Insert(int *x, int N) {
for (int i = 1; i < N; i++) {
int tmp = x[i], j = i-1;
while (j >= 0 && x[j] > tmp) {
x[j+1] = x[j];
j--;
}
x[j+1] = tmp;
}
}
void shell_sort(int *x, int N) {
for (int h = N/2; h > 0; h /= 2)
for (int j = h; j < N; j++) {
int t = x[j], k;
for (k = j-h; k >= 0 && t < x[k]; k -= h)
x[k+h] = x[k];
x[k+h] = t;
}
}
void select_sort(int *x, int n) {
for (int i = 0; i < n-1; i++) {
int min = i;
for (int j = i+1; j < n; j++)
if (x[j] < x[min]) min = j;
if (min != i) swap(x[i], x[min]);
}
}
利用大根堆/小根堆特性,建堆 O(n),每次取頂調整 O(log n)。代碼較長,核心:heapify + build_heap + 循環提取。
void BubbleSort(int *x, int N) {
for (int i = N-1; i > 0; i--)
for (int j = 0; j < i; j++)
if (x[j] > x[j+1]) swap(x[j], x[j+1]);
}
void quick_sort(int *x, int low, int high) {
if (low < high) {
int i = low, j = high, t = x[low];
while (i < j) {
while (i < j && x[j] > t) j--;
if (i < j) x[i++] = x[j];
while (i < j && x[i] <= t) i++;
if (i < j) x[j--] = x[i];
}
x[i] = t;
quick_sort(x, low, i-1);
quick_sort(x, i+1, high);
}
}
分治策略:遞歸分解至單元素,歸並合併有序子序列。需 O(n) 輔助空間,適合鏈表與外排序。
| 條件 | 推薦算法 |
|---|---|
| n ≤ 50 小規模 | 直接插入 / 直接選擇 |
| 基本有序/正序 | 直接插入 / 冒泡 / 隨機快排 |
| 大規模通用 | 快速排序 / 堆排序 / 歸並排序 |
| 要求穩定 | 歸並排序(可結合插入優化) |
| 記憶體極限 | 堆排序(O(1) 空間) |
快速排序是隨機數據下最快的比較排序;堆排序保證最壞 O(n log n) 且省空間;歸並排序提供穩定保證。工程中常混合策略:小區間插入、大區間快排、歸並用於外部/鏈表。
本文代碼均為 C 風格指針操作,易移植至嵌入式環境。