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

C 語言選擇排序交換邏輯:兩種寫法等價性與 OJ 判題差異分析

     編輯:程式設計綜合問答

兩種交換寫法

// 寫法 A
temp = a[i];
a[i] = a[min];
a[min] = temp;

// 寫法 B
temp = a[min];
a[min] = a[i];
a[i] = temp;

邏輯等價性證明

兩者皆執行 a[i] ↔ a[min] 交換,順序不同但最終結果相同。在單執行緒、無副作用的純量交換中完全等價。

OJ 判題不一致可能原因

  1. 提交代碼非預期版本:複製貼上遺漏分號、括號、變數宣告。
  2. 未初始化變數:min、temp 未賦初值(雖交換前已賦值,但編譯器警告可能影響)。
  3. 迴圈邊界錯誤:外層 i < N-1 vs i < N,內層 j < N 導致越界。
  4. 輸入輸出格式:題目要求特定分隔符、換行,printf("%5d") 可能多空格。
  5. 測資差異:本地測試資料與 OJ 隱藏測資不同(如重複值、負數、已排序)。

標準選擇排序模板

for (int i = 0; i < N - 1; i++) {
    int min = i;
    for (int j = i + 1; j < N; j++)
        if (a[j] < a[min]) min = j;
    if (min != i) {
        int temp = a[i];
        a[i] = a[min];
        a[min] = temp;
    }
}

除錯建議

  • 在本地對照 OJ 樣例輸入輸出,逐行 printf 觀察陣列狀態。
  • 使用 assert 驗證排序後有序性。
  • 提交前用多組邊界測資(空陣列、單元素、重複值、逆序)自測。

總結

交換寫法順序不影響正確性。OJ 判題失敗請優先檢查完整提交代碼、輸入輸出格式、迴圈邊界,而非糾結交換順序。

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