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

C 語言選擇排序邏輯錯誤修正

     編輯:程式設計綜合問答

原始碼問題

for (i=0;i

錯誤分析

  1. 內層迴圈 `j=1` 固定從 1 開始,應為 `j = i + 1`(只比較未排序部分)。
  2. 交換邏輯錯誤:`t` 未賦值,且賦值順序導致資料遺失。正確交換需 `t = a[i]; a[i] = a[index]; a[index] = t;`。
  3. 交換操作應在**內層迴圈結束後**(找到最小值索引)執行一次,而非在內層迴圈內每次比較都交換。
  4. `printf("%d", &a[i]);` 應為 `%d` 對應 `a[i]`,而非位址 `&a[i]`。

修正版選擇排序

#include 

int main(void) {
    int n, a[10], i, j, t, index;
    
    printf("Input n: ");
    scanf("%d", &n);
    for (i = 0; i < n; i++) scanf("%d", &a[i]);
    
    for (i = 0; i < n - 1; i++) {        // 只需 n-1 趟
        index = i;
        for (j = i + 1; j < n; j++) {    // 從 i+1 找最小值
            if (a[j] < a[index]) index = j;
        }
        if (index != i) {                // 找到更小值才交換
            t = a[i];
            a[i] = a[index];
            a[index] = t;
        }
    }
    
    printf("After: ");
    for (i = 0; i < n; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

選擇排序核心邏輯

  • **外層**:`i = 0` 到 `n-2`,代表當前要確定的位置。
  • **內層**:`j = i+1` 到 `n-1`,在剩餘元素中找最小值索引 `index`。
  • **交換**:若 `index != i`,交換 `a[i]` 與 `a[index]`。
  • **時間複雜度**:O(n²),交換次數最少(O(n)),適合寫入成本高的場景。

除錯技巧

  • 加入列印觀察每趟結果:`printf("Pass %d: ", i); for(k=0;k
  • 使用編譯器警告:`-Wall` 會提示 `t` 未初始化、`&a[i]` 格式不符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved