演算法核心邏輯
- 從未排序區找出最小元素的索引。
- 將該元素與未排序區首位元素交換。
- 未排序區起始位置後移一格,重複直到剩最後一個元素。
程式碼實作
#include
#include
#define N 10
int main() {
int a[N], i, j, k, t;
printf("隨機產生 10 個 100 以內的數:\n");
for (i = 0; i < N; i++) {
a[i] = rand() % 100;
printf("%d ", a[i]);
}
printf("\n");
for (i = 0; i < N-1; i++) {
k = i; /* 記錄最小值索引 */
for (j = i+1; j < N; j++)
if (a[j] < a[k]) k = j;
if (k != i) { /* 僅在必要時交換 */
t = a[i]; a[i] = a[k]; a[k] = t;
}
}
printf("排序後:\n");
for (i = 0; i < N; i++) printf("%d ", a[i]);
return 0;
}
演示圖解

執行結果

複雜度與特性分析
| 指標 | 數值 |
| 時間複雜度 | O(n²) —— 最好/最壞/平均皆同 |
| 空間複雜度 | O(1) |
| 交換次數 | 最多 n-1 次 —— 所有排序中最少 |
| 穩定性 | 不穩定(交換可能改變相等元素相對順序) |
優化與變體
- 雙向選擇排序:同時找最小與最大,放至兩端,趟數減半。
- 堆積排序:用堆結構優化「找最小」至 O(log n),整體達 O(n log n)。
- 適用場景:寫入成本極高(如 EEPROM、Flash)時,因交換次數少具優勢。