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

Java 排序辨析:選擇排序 vs 冒泡排序,代碼正確性判斷

     編輯:程式設計疑難解答

題目代碼(圖片重構)

for (int i = 0; i < arr.length - 1; i++) {
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[i] > arr[j]) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}

結論:這是「交換排序」的變體,更接近**冒泡排序**邏輯,而非標準選擇排序。

差異對比

特性選擇排序冒泡排序題目代碼
核心邏輯每輪找最小值索引,輪末**單次交換**相鄰比較,**多次交換**冒泡最大值到末尾固定 i,與所有 j>i 比較並**即時交換**
交換次數O(n) 最少O(n²) 最多O(n²) 多次交換
穩定性不穩定穩定不穩定(相等不交換但長距離交換)
標準寫法minIdx=i; for(j) if(arr[j]for(j) if(arr[j]>arr[j+1]) swap(j,j+1)介於兩者之間

標準選擇排序正確實作

public static void selectionSort(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        int minIdx = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIdx]) minIdx = j;
        }
        if (minIdx != i) {
            int temp = arr[i];
            arr[i] = arr[minIdx];
            arr[minIdx] = temp;
        }
    }
}

標準冒泡排序正確實作

public static void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        boolean swapped = false;
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = true;
            }
        }
        if (!swapped) break; // 提前結束優化
    }
}

題目代碼的正確性

  • **能正確排序**:邏輯上將較小值不斷向前交換,最終陣列會有序。
  • **效率較差**:每輪可能觸發多次交換(最坏 O(n²) 交換),且無提前結束優化。
  • **命名誤導**:若註解寫「選擇排序」屬於錯誤標註。

總結

題目代碼屬於**簡單交換排序**,正確性無誤但非標準選擇排序。教學/面試場合請使用標準選擇排序(單次交換)或冒泡排序(相鄰比較),並能說出時空複雜度與穩定性差異。

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