原始錯誤代碼
for(i=0;i for(j=1;j if(shuzu[j-1]>shuzu[j]) {
int a=shuzu[j-1];
shuzu[j-1]=shuzu[j];
shuzu[j]=shuzu[j-1]; // 錯誤:此時 shuzu[j-1] 已被覆蓋
}
主要問題
- 外層循環條件缺失:
for(i=0;i 未給出終止條件。
- 內層循環邏輯反常: 冒泡排序內層通常
j < n-i,而非 j<=i。
- 交換邏輯錯誤: 需臨時變量保存
shuzu[j-1],再賦值 shuzu[j],最後恢復到 shuzu[j-1]。原代碼連續賦值導致數據丟失。
- 打印語句分號為中文全角:
; 導致編譯錯誤。
修正代碼 (標準冒泡排序)
#include <stdio.h>
int main() {
int shuzu[5] = {1, 4, 2, 8, 7};
int i, j, temp;
for (i = 0; i < 5; i++) {
for (j = 1; j < 5 - i; j++) { // 每輪將最大值冒泡到末尾
if (shuzu[j-1] > shuzu[j]) {
temp = shuzu[j-1];
shuzu[j-1] = shuzu[j];
shuzu[j] = temp;
}
}
}
for (i = 0; i < 5; i++) {
printf("%d\n", shuzu[i]);
}
return 0;
}
輸出結果
1
2
4
7
8
總結
- 冒泡排序核心:相鄰比較、大後移、輪數遞減。
- 交換必須用臨時變量,順序:存 A → A=B → B=存值。
- 循環邊界仔細驗證,避免越界或少排。