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

C 語言排序邏輯錯誤:巢狀迴圈變數衝突與選擇排序修正

     編輯:程式設計綜合問答

原始碼問題

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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved