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

Java 排序效能實測:插入 vs 選擇 vs 冒泡,為何理論與實際不符?

     編輯:程式設計綜合問答

實驗現象

自學者以 100,000 筆隨機整數測試三種 O(n²) 排序,結果:

  • 選擇排序:~3 秒
  • 插入排序:~8 秒
  • 冒泡排序:~19 秒

影片教學常稱「插入優於選擇」,實測卻相反,令人困惑。

核心解析

1. 同階複雜度下,常數因子決定實際速度

三者皆為 O(n²),但資料移動次數、比較次數、分支預測友善度不同:

演算法比較次數交換/移動次數最佳情況最壞情況
選擇排序固定 n(n-1)/2最多 n-1 次交換O(n²)O(n²)
插入排序約 n²/4(隨機)約 n²/4 次移動O(n)(近乎有序)O(n²)
冒泡排序約 n²/2約 n²/2 次交換O(n)(有序)O(n²)

2. 為何選擇排序在隨機資料上最快?

  • 寫入記憶體最少:僅交換 n 次,插入排序需大量位移元素(記憶體寫入昂貴)。
  • 分支預測友善:內層迴圈固定尋找最小值,CPU 分支預測命中率高。
  • 插入排序優勢在「近乎有序」資料:若測試資料為隨機,插入排序優勢無法發揮。

3. 真正高效的排序:O(n log n) 演算法

實務上應直接使用 Arrays.sort()(雙軸快排)或 Collections.sort()(TimSort),平均 O(n log n),大幅優於 O(n²)。

結論

  • 教學影片說「插入優於選擇」通常指近乎有序或小規模資料。
  • 隨機大量資料下,選擇排序因寫入少反而較快。
  • 生產環境勿手寫 O(n²) 排序,直接呼叫標準庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved