本文詳細分析 C 語言中三種基礎排序算法——冒泡排序、選擇排序、插入排序的原理、代碼實現、特點與適用場景,所有範例均以 10 個整數為對象演示。
n-1 趟比較,第 j 趟比較 n-j 次相鄰元素。#include
int main() {
int a[10], i, j, t;
printf("Please input 10 numbers: ");
for (i = 0; i < 10; i++) scanf("%d", &a[i]);
for (j = 0; j < 9; j++) // n-1 趟
for (i = 0; i < 9 - j; i++) // 第 j 趟比較 n-j 次
if (a[i] > a[i+1]) { // 相鄰逆序則交換
t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
printf("The sorted numbers: ");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
n-1 趟,第 i 趟假設 a[i] 為最值,向後掃描找出真正最值下標 k,若 k != i 則交換。#include
int main() {
int a[10], i, j, k, t, n = 10;
printf("Please input 10 numbers: ");
for (i = 0; i < 10; i++) scanf("%d", &a[i]);
for (i = 0; i < n-1; i++) {
k = i; // 假設當前為最值
for (j = i+1; j < n; j++) // 向後尋找更大值
if (a[k] < a[j]) k = j;
if (k != i) { // 找到更大值則交換
t = a[k]; a[k] = a[i]; a[i] = t;
}
}
printf("The sorted numbers: ");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
n-1 次插入,元素最終位置在**最後一趟**才確定。#include
int main() {
int a[10], i, j, t;
printf("Please input 10 numbers: ");
for (i = 0; i < 10; i++) scanf("%d", &a[i]);
for (i = 1; i < 10; i++) { // 從第 2 個元素開始插入
t = a[i]; // 暫存待插入值
for (j = i-1; j >= 0 && t > a[j]; j--) // 從後往前找位置,邊移動
a[j+1] = a[j];
a[j+1] = t; // 插入
}
printf("The sorted numbers: ");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
| 算法 | 時間複雜度 | 空間複雜度 | 穩定性 | 交換/移動次數 | 適用場景 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 穩定 | 多 | 教學、極小數據量 |
| 選擇排序 | O(n²) | O(1) | 不穩定 | 少(≤n-1) | 移動代價大時 |
| 插入排序 | O(n²) 最佳 O(n) | O(1) | 穩定 | 視有序度而定 | 小規模、近乎有序數據 |
qsort(快速排序)、歸併排序、堆排序等 O(n log n) 算法。