| 演算法 | 平均時間 | 最壞時間 | 空間 | 穩定性 | 適用場景 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 穩定 | 教學、極小資料 |
| 選擇排序 | O(n²) | O(n²) | O(1) | 不穩定 | 交換成本高時 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不穩定 | 通用高效排序 |
| 插入排序 | O(n²) | O(n²) | O(1) | 穩定 | 近乎有序/小規模 |
| 希爾排序 | O(n^1.3~1.5) | O(n²) | O(1) | 不穩定 | 中等規模、嵌入式 |
void bubble(int *a, int n) {
for (int i = 0; i < n-1; i++)
for (int j = i+1; j < n; j++)
if (a[i] > a[j]) {
int t = a[i]; a[i] = a[j]; a[j] = t;
}
}
void select_sort(int *a, int n) {
for (int i = 0; i < n-1; i++) {
int k = i;
for (int j = i+1; j < n; j++)
if (a[k] > a[j]) k = j;
if (k != i) { int t = a[i]; a[i] = a[k]; a[k] = t; }
}
}
void quick(int *a, int left, int right) {
if (left >= right) return;
int i = left, j = right, pivot = a[(left+right)/2];
do {
while (a[i] < pivot) i++;
while (a[j] > pivot) j--;
if (i <= j) { int t = a[i]; a[i] = a[j]; a[j] = t; i++; j--; }
} while (i <= j);
if (left < j) quick(a, left, j);
if (i < right) quick(a, i, right);
}
void insert_sort(int *a, int n) {
for (int i = 1; i < n; i++) {
int tmp = a[i], j = i-1;
while (j >= 0 && tmp < a[j]) { a[j+1] = a[j]; j--; }
a[j+1] = tmp;
}
}
void shell_sort(int *a, int n) {
for (int gap = n/2; gap >= 1; gap /= 2)
for (int i = gap; i < n; i++) {
int tmp = a[i], j = i - gap;
while (j >= 0 && tmp < a[j]) { a[j+gap] = a[j]; j -= gap; }
a[j+gap] = tmp;
}
}
void print_arr(int *a, int n) {
for (int i = 0; i < n; i++) printf("%4d", a[i]);
putchar('\n');
}
int main(void) {
int base[] = {13,0,5,8,1,7,21,50,9,2};
int a[5][10];
for (int i = 0; i < 5; i++) memcpy(a[i], base, sizeof(base));
printf("Original: "); print_arr(base, 10);
bubble(a[0], 10); printf("Bubble: "); print_arr(a[0], 10);
select_sort(a[1], 10); printf("Select: "); print_arr(a[1], 10);
quick(a[2], 0, 9); printf("Quick: "); print_arr(a[2], 10);
insert_sort(a[3], 10); printf("Insert: "); print_arr(a[3], 10);
shell_sort(a[4], 10); printf("Shell: "); print_arr(a[4], 10);
return 0;
}
Original: 13 0 5 8 1 7 21 50 9 2 Bubble: 0 1 2 5 7 8 9 13 21 50 Select: 0 1 2 5 7 8 9 13 21 50 Quick: 0 1 2 5 7 8 9 13 21 50 Insert: 0 1 2 5 7 8 9 13 21 50 Shell: 0 1 2 5 7 8 9 13 21 50
五種演算法同樣輸入產生相同正確輸出,展示各自實作細節與效能特性。