如果數組長度小於某個閾值,Java 6的mergedortort實現在Arrays.java
中使用插入排序。該值被硬編碼爲7.由於算法是遞歸的,對於大型數組,這最終會發生多次。規範merge-sort algorithm不會這樣做,只需使用合併排序,直到列表中只有一個元素。爲什麼Java 6 Arrays#sort(Object [])從mergesort更改爲insertionsort用於小數組?
這是優化嗎?如果是這樣,它應該如何幫助?爲什麼7
?插入排序(甚至是<=7
的東西)增加了大量排序所需的比較次數 - 所以會增加成本,其中compareTo()
調用速度較慢。
(x軸是size of array
,y軸是# of comparisons
,對於INSERTIONSORT_THRESHOLD
不同的值)
,這是什麼圖形的來源?你似乎在展示它沒有任何評論 –
我通過排序對象的數組,其計數的compareTo被調用的次數和不同INSERTIONSORT_THRESHOLD使這個圖形。 –
值得注意的是,Java7也有Timsort,它是Tim Peters爲python開發的混合插入。 http://download.java.net/jdk7/docs/api/java/util/Arrays.html#sort%28java.lang.Object [] – Tremmors