2013-05-16 32 views
9

據更大,以Wikipedia爲什麼歸併排序使用Java來排序的陣列比元件7

「在Java中,Arrays.sort()方法使用合併排序或調諧 快速排序取決於數據類型和執行效率 開關進行排序時插入少於七個數組元素 進行排序」

但是,爲什麼?合併排序和快速排序均爲O(n log n)

+2

http://stackoverflow.com/questions/3707190/why-java-arrays-use-two-different-sort-algorithms-for-different-types –

+0

我知道雅尼是要出現了,嫌我爲此,但這可能應該是程序員。 – MikeTheLiar

+0

這裏是代碼的作者的答案http://stackoverflow.com/questions/15154158/why-collections-sort-is-using-merge-sort-insteadof-quicksort –

回答

1

這不是即席:

Arrays.java的排序方法採用快速排序基本類型數組和對象數組歸併排序。

Why does Java's Arrays.sort method use two different sorting algorithms for different types?

此外,根據該文檔:

例如,通過排序所使用的算法(對象[])不必是一個合併,但它必須是穩定的。

而且從另一個的javadoc報價:

此排序被保證是穩定的:相等的元素不會被 重新排序作爲排序的結果。

實現注意事項:此實現了穩定的,自適應的, 迭代歸併需要遠小於n LG更少(n)的比較 當輸入陣列部分地排序,同時提供一個傳統的歸併的 性能當輸入陣列是隨機排列的 。如果輸入數組幾乎排序,那麼執行大約需要n次比較。臨時存儲 要求從幾乎排序的輸入數組 的小常數到隨機排序的輸入數組的n/2個對象引用不相同。

該實施方式在其輸入數組中順序上升和下降 順序相等,並且可以利用相同輸入數組的不同部分中的升序和降序。這是 非常適合合併兩個或更多的排序數組:簡單地連接數組並排序結果數組。

該實現改編自Tim Peters的列表,用於Python (TimSort)。

+0

以及我犯了一個錯誤看到編輯,我的意思是快速排序。 – joker

0

他們移動到調整合並排序,因爲發現統計爲真正的部分排序數據集此方法可能比快速排序快一點。

+2

Java從未使用MergeSort作爲基元,並且從不使用QuickSort作爲引用類型。 –

+2

他們是誰?請參考。 –

+0

參考文獻:http://docs.oracle.com/javase/tutorial/collections/algorithms/ – AlexR

10

其中算法不同的是它們的典型案例的行爲,這是插入排序最差的地方之一。另一方面,對於非常小的集合(n≈n )插入排序的簡單性勝。

Java的算法選擇規則首選喜歡QuickSort,並且由於特定的限制只能回退到其他東西。 QuickSort,也就是不穩定排序,因此只能用於基元的排序。對於參考類型,從OpenJDK 7(之前的MergeSort)開始使用TimSort。

+0

我犯了一個錯誤,我的意思是快速排序,請參閱編輯。 – joker

+1

附加說明:插入排序在小集合上獲勝,因爲它具有較低的常量因子,而大O不記錄。請注意,例如:'n <10'的'n^2 <10n'。 – Dukeling

+0

@Dukeling是的,這是我的觀點。簡單性意味着低常數因子。 –

1

Quicksort和mergesort都是O(n log n)在的平均值的性能。在最壞的情況下,快速排序是O(n^2)。

+1

他們的平均情況不是O(n^2),,其O(nlogn)。 –

+0

感謝您的支持。我專注於n^2最糟糕的情況,並且意外地輸入了平均值。 –