原始碼問題
for (i = 0; i < 9; i++) {
max = imax(vb, 10 - i);
for (j = 0, k = 0; j < 10-i; j++) { ... }
for (l = 0; l < 10-i; l++) { ... } // ❌ 內層迴圈重用 i 作為邊界,但 i 是外層變數
}
核心錯誤
- 外層
for (i = 0; i < 9; i++) 中,內層迴圈條件用 10-i,但內層**沒有修改 i**,邏輯上可行但極易混淆。
- 真正的 Bug:
imax(vb, 10-i) 每次傳入遞減長度,但 `imax` 內部迴圈 `for (i = 0; i < n; i++)` **覆寫了外層的 i**,導致外層迴圈失控。
修正:區域變數隔離
int imax(int arr[], int n) {
int max = arr[0];
for (int idx = 0; idx < n; idx++) // 用 idx 而非 i
if (arr[idx] > max) max = arr[idx];
return max;
}
int main() {
int vb[10], vc[10];
// ... 輸入 ...
for (int round = 0; round < 9; round++) { // 外層用 round
int max = imax(vb, 10 - round);
int k = 0;
for (int j = 0; j < 10 - round; j++) { // 內層用 j
if (vb[j] < max) vc[k++] = vb[j];
}
vc[9 - round] = max;
for (int j = 0; j < 10 - round; j++) // 複製回 vb
vb[j] = vc[j];
}
// 輸出 vb
}
更簡潔:標準庫 qsort / std::sort
#include <stdlib.h>
int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
qsort(vb, 10, sizeof(int), cmp);