選擇排序的核心是「每輪選出最小值,與當前位置交換」。很多初學者將交換代碼放在內層循環內部,導致多次無意義交換,破壞排序邏輯。本文通過對比錯誤與正確代碼,詳細講解選擇排序的正確實現。
// 錯誤版本
for (i = 0; i < 9; i++) {
iTemp = a[i];
iPos = i;
for (j = i + 1; j < 10; j++) {
if (a[j] < iTemp) {
iTemp = a[j];
iPos = j;
}
/* 交換兩個元素 - 錯誤位置! */
a[iPos] = a[i];
a[i] = iTemp;
}
}
問題:交換語句在 if 塊外、但仍在內層循環內。每次內層循環迭代都會執行交換,導致 a[i] 反覆被修改,最終結果不可預期。
// 正確版本:選擇排序標準實現
for (i = 0; i < 9; i++) {
for (j = i + 1; j < 10; j++) {
if (a[j] < a[i]) { // 直接比較 a[i] 與 a[j]
iTemp = a[i]; // 交換
a[i] = a[j];
a[j] = iTemp;
}
}
}
關鍵差異:
iTemp、iPos 中間變量記錄最小值a[i] 與 a[j],發現更小即交換if 內部,確保只在必要時交換i = 0 ~ n-2,代表當前待確定的位置j = i+1 ~ n-1,尋找比 a[i] 更小的元素a[i] 和 a[j]a[i] 確定為剩餘元素中的最小值為排序算法添加打印輸出,觀察每輪交換情況:
printf("第 %d 輪: ", i);
for (int k = 0; k < 10; k++) printf("%d ", a[k]);
printf("\n");
能直觀發現交換邏輯是否正確。