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

Java 選擇排序外層迴圈 i=0 與 i=1 差異:為何必須從 0 開始

     編輯:程式設計綜合問答

選擇排序核心邏輯

for (int i = 0; i < n - 1; i++) {
    int minIdx = i;
    for (int j = i + 1; j < n; j++)
        if (a[j] < a[minIdx]) minIdx = j;
    swap(a[i], a[minIdx]); // 將最小值放到位置 i
}

i=0 必要性說明

  • 第 0 輪:在 a[0..n-1] 找最小值,交換到 a[0] → 確保 a[0] 為全域最小。
  • 第 1 輪:在 a[1..n-1] 找最小值,交換到 a[1] → 確保 a[1] 為次小。
  • 若從 i=1 開始,a[0] 永不參與比較交換,可能不是最小值 → 排序錯誤。

「多排一趟」誤區澄清

外層迴圈執行 n-1 趟(i=0..n-2),最後一趟 i=n-2 比較 a[n-2] 與 a[n-1],交換後 a[n-1] 自動為最大值,**無需第 n 趟**。

程式碼對比

// 正確
for (int i = 0; i < n - 1; i++)

// 錯誤:漏掉 a[0] 定位
for (int i = 1; i < n - 1; i++)

總結

選擇排序每一趟將當前無序區最小值放到有序區末尾。i=0 對應有序區第一個位置,**不可省略**,否則首元素無法保證為最小值。

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