選擇排序 是最直觀的排序算法之一:每一輪從未排序區間找出最小元素,放到已排序區間末尾。雖然時間複雜度固定為 O(n²),但交換次數最少(最多 n-1 次),在數據移動開銷大時有一定優勢。
minIdx。minIdx != i,交換兩者位置。#include#include #include #define N 10 int main() { int a[N], i, j, k, t; srand((unsigned)time(NULL)); 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]); } printf("\n"); return 0; }
隨機產生 10 個 100 以內的數: 45 12 89 33 7 56 21 98 4 67 排序後輸出: 4 7 12 21 33 45 56 67 89 98
| 特性 | 描述 |
|---|---|
| 時間複雜度 | 最好/最壞/平均均為 O(n²),與輸入無關 |
| 空間複雜度 | O(1),原地排序 |
| 穩定性 | 不穩定(交換可能改變相等元素相對順序) |
| 交換次數 | 最多 N-1 次,所有排序中最少 |
| 適用場景 | 數據量小、內存寫入開銷大(如 Flash 存儲) |
選擇排序邏輯清晰、代碼簡短、交換次數最少,是教學與小規模數據排序的優秀選擇。理解其「選最小、換到位」的核心思想,有助於掌握堆排序等進階算法。實際工程中,對性能敏感場景請優先考慮快速排序、歸並排序或系統庫函數 qsort。