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

C 語言選擇排序:交換邏輯必須寫在外層迴圈之後

     編輯:程式設計疑難解答

錯誤代碼片段

for (i = 0; i < n-1; i++) {
    k = i;
    for (j = i+1; j < n; j++)
        if (a[j] < a[k]) k = j;
    if (k != i) swap(a[k], a[i]); // ❌ 錯誤位置:寫在內層迴圈裡
}

正確邏輯

選擇排序核心:**每輪內層迴圈只負責「找出最小值索引 k」,交換動作必須在內層迴圈結束、外層迴圈下一次迭代前執行。**

標準實作

void selectionSort(int a[], int n) {
    for (int i = 0; i < n-1; i++) {
        int k = i;                          // 假設當前位置即最小
        for (int j = i+1; j < n; j++) {     // 掃描未排序區間
            if (a[j] < a[k]) k = j;         // 更新最小值索引
        }
        if (k != i) {                       // 內層結束後,才決定是否交換
            int temp = a[i];
            a[i] = a[k];
            a[k] = temp;
        }
    }
}

為何寫在內層會錯?

  • 若在內層交換,a[i] 的值會在掃描過程中被改變,導致後續比較基準錯誤,破壞「未排序區間最小值」的不變量。
  • 可能導致多次無謂交換,時間複雜度雖仍為 O(n²),但常數因子變大且結果錯誤。

複雜度與特性

項目數值
時間複雜度O(n²)(最好/平均/最壞皆同)
空間複雜度O(1) 原地排序
穩定性不穩定(交換可能改變相等元素相對順序)
交換次數最多 n-1 次(所有排序中最少)

總結

選擇排序的關鍵在於「先找、後換」。**交換語句必須放在外層迴圈內、內層迴圈外**,這是教科書級的標準寫法,請務必肌肉記憶。

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