首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

插入排序中 else break 為何不可少?揭秘 C 語言死循環陷阱

     編輯:程式設計綜合問答

初學者編寫插入排序降序排列代碼時,發現去掉 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; 僅是「糾正」了這個死循環,掩蓋了真正的邏輯錯誤。

正確寫法

  1. 內層循環不要修改外層循環變量,改用臨時變量:
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 只能跳出當前層循環,不能掩蓋邏輯缺陷。
  • 插入排序標準模式:外層遍歷無序區,內層在有序區後移元素騰位置。

掌握這一點,排序算法不再「跑飛」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved