初學者編寫插入排序降序排列代碼時,發現去掉 else break; 程序就跑不動,陷入死循環。這背後隱藏著循環變量作用域與修改的經典陷阱。
for(i=2; i<=A; i++) {
for(j=i-1; j>=1; i--, j--) // 此處同時修改 i 和 j
if(a[i] > a[j]) { ... }
else break;
}
內層循環中 i-- 導致外層循環變量 i 被修改。內層結束後 i 變為 1,外層 i++ 又變回 2,隨後再次進入內層又被減為 1,形成無限循環。else break; 僅是「糾正」了這個死循環,掩蓋了真正的邏輯錯誤。
for(i=2; i<=A; i++) {
int temp = a[i];
for(j=i-1; j>=1 && a[j] < temp; j--)
a[j+1] = a[j];
a[j+1] = temp;
}
break 只能跳出當前層循環,不能掩蓋邏輯缺陷。掌握這一點,排序算法不再「跑飛」。