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

C語言選擇排序邏輯錯誤:交換位置放錯導致排序失效

     編輯:程式設計綜合問答

選擇排序的核心是「每輪選出最小值,與當前位置交換」。很多初學者將交換代碼放在內層循環內部,導致多次無意義交換,破壞排序邏輯。本文通過對比錯誤與正確代碼,詳細講解選擇排序的正確實現。

錯誤代碼分析


// 錯誤版本
for (i = 0; i < 9; i++) {
    iTemp = a[i];
    iPos = i;
    for (j = i + 1; j < 10; j++) {
        if (a[j] < iTemp) {
            iTemp = a[j];
            iPos = j;
        }
        /* 交換兩個元素 - 錯誤位置! */
        a[iPos] = a[i];
        a[i] = iTemp;
    }
}

問題:交換語句在 if 塊外、但仍在內層循環內。每次內層循環迭代都會執行交換,導致 a[i] 反覆被修改,最終結果不可預期。

正確代碼


// 正確版本:選擇排序標準實現
for (i = 0; i < 9; i++) {
    for (j = i + 1; j < 10; j++) {
        if (a[j] < a[i]) {          // 直接比較 a[i] 與 a[j]
            iTemp = a[i];           // 交換
            a[i] = a[j];
            a[j] = iTemp;
        }
    }
}

關鍵差異:

  • 無需 iTemp、iPos 中間變量記錄最小值
  • 直接比較 a[i] 與 a[j],發現更小即交換
  • 交換發生在 if 內部,確保只在必要時交換

選擇排序標準算法流程

  1. 外層循環 i = 0 ~ n-2,代表當前待確定的位置
  2. 內層循環 j = i+1 ~ n-1,尋找比 a[i] 更小的元素
  3. 發現更小元素時,立即交換 a[i] 和 a[j]
  4. 內層結束後,a[i] 確定為剩餘元素中的最小值

複雜度與特點

  • 時間複雜度:O(n²),不受數據分布影響
  • 空間複雜度:O(1),原地排序
  • 穩定性:不穩定(交換可能改變相等元素相對順序)
  • 交換次數:最多 n-1 次,比冒泡排序少

調試技巧

為排序算法添加打印輸出,觀察每輪交換情況:


printf("第 %d 輪: ", i);
for (int k = 0; k < 10; k++) printf("%d ", a[k]);
printf("\n");

能直觀發現交換邏輯是否正確。

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