for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++)
if (a[j] < a[minIdx]) minIdx = j;
swap(a[i], a[minIdx]); // 將最小值放到位置 i
}
a[0..n-1] 找最小值,交換到 a[0] → 確保 a[0] 為全域最小。a[1..n-1] 找最小值,交換到 a[1] → 確保 a[1] 為次小。i=1 開始,a[0] 永不參與比較交換,可能不是最小值 → 排序錯誤。外層迴圈執行 n-1 趟(i=0..n-2),最後一趟 i=n-2 比較 a[n-2] 與 a[n-1],交換後 a[n-1] 自動為最大值,**無需第 n 趟**。
// 正確
for (int i = 0; i < n - 1; i++)
// 錯誤:漏掉 a[0] 定位
for (int i = 1; i < n - 1; i++)
選擇排序每一趟將當前無序區最小值放到有序區末尾。i=0 對應有序區第一個位置,**不可省略**,否則首元素無法保證為最小值。