#include <stdio.h>
#include <stdlib.h>
#define LEN 10
int main(void) {
int array[LEN], i, j, min, tmp;
printf("請輸入 %d 個整數:", LEN);
for (i = 0; i < LEN; ++i) scanf("%d", &array[i]);
puts("原始資料:");
for (i = 0; i < LEN; ++i) printf("%d ", array[i]);
putchar('\n');
/* 選擇排序:每輪在未排序區找最小值,與首位交換 */
for (i = 0; i < LEN - 1; ++i) {
min = i;
for (j = i + 1; j < LEN; ++j)
if (array[min] > array[j]) min = j;
if (min != i) {
tmp = array[min];
array[min] = array[i];
array[i] = tmp;
}
}
puts("排序結果:");
for (i = 0; i < LEN; ++i) printf("%d ", array[i]);
putchar('\n');
return 0;
}
n(n-1)/2,但交換次數最多 n-1,優於氣泡排序的頻繁交換。原文註解稱「單向氣泡排序」,實際程式碼為選擇排序。兩者差異:
| 特性 | 氣泡排序 | 選擇排序 |
|---|---|---|
| 核心動作 | 相鄰比較交換,大值「浮」至末端 | 掃描找極值,與首位交換 |
| 交換次數 | O(n²) | O(n) |
| 穩定性 | 穩定 | 不穩定 |