輸入 10 個整數,按從大到小順序排序輸出。輸入範例:2 0 3 -4 8 9 5 1 7 6,期望輸出:9 8 7 6 5 3 2 1 0 -4。
核心思想:每輪從未排序區間選出最大值,與區間首位交換。雙層循環,外層控制輪數,內層尋找最大值索引。
#include <stdio.h>
int main() {
int num[10], i, j, k, temp;
for (i = 0; i <= 9; i++) scanf("%d", &num[i]);
for (j = 0; j < 9; j++) {
for (k = j + 1; k <= 9; k++) {
if (num[j] < num[k]) { // 降序:前者小於後者則交換
temp = num[j];
num[j] = num[k];
num[k] = temp;
}
}
}
for (i = 0; i <= 9; i++) printf("%d ", num[i]);
return 0;
}
時間複雜度 O(n²),交換次數最少(最多 n-1 次),適合數據移動成本高的場景。
核心思想:相鄰元素兩兩比較,大者「沉底」、小者「冒頂」。每輪將當前未排序區間的最小值移至末尾。
#include <stdio.h>
int main() {
int num[10], i, j, k, temp;
for (i = 0; i <= 9; i++) scanf("%d", &num[i]);
for (j = 0; j < 9; j++) {
for (k = 0; k < 9 - j; k++) {
if (num[k] < num[k + 1]) { // 降序:前者小於後者交換
temp = num[k];
num[k] = num[k + 1];
num[k + 1] = temp;
}
}
}
for (i = 0; i <= 9; i++) printf("%d ", num[i]);
return 0;
}
時間複雜度同為 O(n²),但交換次數較多。優勢在於代碼簡潔、易於理解,且可通過標誌位優化已排序序列的最佳情況至 O(n)。
| 特性 | 選擇排序 | 冒泡排序 |
|---|---|---|
| 比較次數 | 固定 n(n-1)/2 | 固定 n(n-1)/2 |
| 交換次數 | 最多 n-1 次 | 最多 n(n-1)/2 次 |
| 穩定性 | 不穩定 | 穩定 |
| 適用場景 | 數據移動昂貴、小規模數據 | 教學演示、近乎有序數據 |
實際工程中小規模數據推薦插入排序,大規模首選快速排序、歸併排序或標準庫 qsort。