Java排序函數
回答
您可以通過查看相關的Javadocs甚至source code輕鬆驗證您的前提。首先,注意Collections.sort(List<T>)
簡單地委託給Arrays.sort(Object[])
(source):
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
所以這兩種方法都會有相同的行爲和運行。正如文檔中指出的那樣,實現是TimSort,一個合併排序和插入排序混合。它保證穩定。因此,無論您有數組還是集合,排序對象的工作方式都是相同的。
你鏈接到的文章指的是排序基元數組。關於原始數組需要做的假設較少,特別是相同的原始數據根據定義是不可區分的。這意味着沒有必要確保穩定的排序。您會注意到原始排序方法的文檔,如Arrays.sort(int[])
,並沒有提到這些排序方法的穩定性,因爲這樣的細節沒有意義。排序數據可以相同但不相同時,穩定性只是很重要。
Arrays.sort將比Collections.sort稍快,因爲Collections.sort在內部調用Arrays.sort。 當處理基元時,穩定性不相關,因爲具有相同值的基元可以重新排列而沒有副作用。 Arrays.sort提供了額外的性能優勢。因此,對於原始數組,Arrays.sort將是首選。
這並不回答這個問題。 – hexafraction
是的,這實際上是關於他們使用哪種算法,爲什麼? –
Arrays.sort
並沒有真正使用常見的快速排序實現,javadoc中指定:
的排序算法是一個雙樞軸快速排序弗拉基米爾· Yaroslavskiy,喬恩·本特利,以及約書亞·布洛克。該算法在許多數據集上提供了 O(n log(n))性能,這些數據集導致其他快速排序 降級爲二次性能,並且通常比傳統(單軸)Quicksort實現更快。
看看位於DualPivotQuicksort
的排序算法;正如您在註釋中看到的,根據給定的數組使用不同的排序算法。
至於Collections
排序方法,它在接收到的實現上調用sort
(在我驗證的情況下)代表Arrays.sort
。
Arrays.sort
僅對原始數組使用雙樞軸快速排序算法,其中穩定排序算法和不穩定排序算法之間沒有區別。這通常被認爲稍快,但不穩定,所以它只用於穩定性無關的情況。
Arrays.sort
對象數組,和Collections.sort
,使用Timsort,這是一個合併排序變體,進行穩定的排序。
- 1. 使用java排序函數
- 2. 排序函數不排序
- 3. 排序(構造函數)在Java中
- 4. Javascript函數排序。
- 5. Lisp排序函數
- 6. C++:排序函數
- 7. LVM_SORTITEMS排序函數
- 8. 排序函數C++
- 9. Java:排序數據
- 10. 基數排序Java
- 11. list by append函數不能按排序函數排序
- 12. PHP排序數組函數
- 13. cs50 pset3排序函數
- 14. 排序方式lexicographical_compare()函數
- 15. TensorFlow成本函數排序
- 16. 排序()與lambda函數
- 17. C庫函數做排序
- 18. SQL函數,COALESCE和排序
- 19. 排序()函數後appendTo tbody
- 20. 測試排序函數
- 21. boost :: ptr_vector排序函數
- 22. 排序函數在ajax表
- 23. 構造函數排序
- 24. 排序SQL結果()函數
- 25. 序言排列函數
- 26. 用於在java中排序對象數組的比較函數?
- 27. 動態排序依據排名函數
- 28. 排序2D int數組JAVA
- 29. Java數組排序UTF-8
- 30. Java NullPointerException排序數組
我以爲他們都使用TimSort。我需要檢查源代碼。 –
哦,你確定我在網上找到了。 –
@ArjunChaudhary「我發現在互聯網上」是相當無益的。你在哪找到它的? – dimo414