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) swap(a[k], a[i]); // ❌ 錯誤位置:寫在內層迴圈裡
}
選擇排序核心:**每輪內層迴圈只負責「找出最小值索引 k」,交換動作必須在內層迴圈結束、外層迴圈下一次迭代前執行。**
void selectionSort(int a[], int n) {
for (int i = 0; i < n-1; i++) {
int k = i; // 假設當前位置即最小
for (int j = i+1; j < n; j++) { // 掃描未排序區間
if (a[j] < a[k]) k = j; // 更新最小值索引
}
if (k != i) { // 內層結束後,才決定是否交換
int temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
a[i] 的值會在掃描過程中被改變,導致後續比較基準錯誤,破壞「未排序區間最小值」的不變量。| 項目 | 數值 |
|---|---|
| 時間複雜度 | O(n²)(最好/平均/最壞皆同) |
| 空間複雜度 | O(1) 原地排序 |
| 穩定性 | 不穩定(交換可能改變相等元素相對順序) |
| 交換次數 | 最多 n-1 次(所有排序中最少) |
選擇排序的關鍵在於「先找、後換」。**交換語句必須放在外層迴圈內、內層迴圈外**,這是教科書級的標準寫法,請務必肌肉記憶。