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

C 語言選擇排序錯誤修正:邏輯重構與標準實現

     編輯:程式設計疑難解答

原代碼問題

  • 外層循環條件 `j<5` 與數組長度 4 不符。
  • 內層循環變量 `i` 未重置,且 `min` 更新邏輯錯誤導致輸出混亂。
  • 打印位置錯誤,排序過程中輸出干擾觀察。

標準選擇排序

#include <stdio.h>
int main() {
    int s[4], i, j, minIdx, temp;
    for (i = 0; i < 4; i++) scanf("%d", &s[i]);
    for (j = 0; j < 3; j++) {           // 只需 n-1 輪
        minIdx = j;
        for (i = j + 1; i < 4; i++)     // 從未排序區找最小
            if (s[i] < s[minIdx]) minIdx = i;
        if (minIdx != j) {              // 交換
            temp = s[minIdx];
            s[minIdx] = s[j];
            s[j] = temp;
        }
    }
    for (i = 0; i < 4; i++) printf("%d\n", s[i]);
    return 0;
}

關鍵點講解

  1. 外層輪數 n-1: 最後一個元素自動就位。
  2. 內層起始 j+1: 已排序區不參與比較。
  3. 記錄最小值索引 minIdx: 而非最小值本身,便於交換。
  4. 僅當 minIdx != j 時交換: 減少無意義賦值。

複雜度與穩定性

  • 時間 O(n²),空間 O(1)。
  • **不穩定**:相等元素相對位置可能改變(如 5₁ 5₂ → 交換後 5₂ 5₁)。

調試技巧

在外層循環末尾加 `printf("Round %d: ", j); for(i=0;i<4;i++) printf("%d ", s[i]); puts("");` 觀察每輪狀態,快速定位邏輯錯誤。

掌握標準模板,告別手寫排序 Bug。

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