// 原代碼查找插入位置循環:
for(i=1; i<=8; i++) {
if(num > count[i] && num <= count[i+1]) // i=8 時 count[9] 越界!
index = i;
}
數組 count[9] 下標合法範圍 0~8(或代碼中 1~8)。循環到 i=8 時,count[i+1] 即 count[9] 越界訪問,導致未定義行為(程序卡死、崩潰、輸出亂碼)。
數組已按降序排列(大→小)。插入 num 只需找到第一個小於 num 的位置,即為插入點。
// 修正查找插入位置
index = 9; // 默認插到最後
for(i = 1; i <= 8; i++) {
if (num > count[i]) { // 找到第一個比 num 小的元素
index = i;
break;
}
}
// 若 num 最小,index 保持 9(插到末尾)
// 後移元素騰出位置
for(i = 8; i >= index; i--) {
count[i+1] = count[i];
}
count[index] = num; // 插入
count[1..8]。num。count[i] < num 的第一個 i 作為插入位置 index。index..8 後移一位,count[index] = num。| 原數組(降序) | 插入值 | 預期結果 |
|---|---|---|
| 90 80 70 60 50 40 30 20 | 95 | 95 90 80 70 60 50 40 30 20 (index=1) |
| 90 80 70 60 50 40 30 20 | 55 | 90 80 70 60 55 50 40 30 20 (index=5) |
| 90 80 70 60 50 40 30 20 | 10 | 90 80 70 60 50 40 30 20 10 (index=9) |
| 90 80 70 60 50 40 30 20 | 70 | 90 80 70 70 60 50 40 30 20 (index=3, 穩定性視需求) |
i < n 或 i <= n-1,切勿訪問 a[n]。