Java的Arrays.sort
方法使用快速排序基本類型數組和對象數組歸併排序。我相信大部分時間Quicksort比合並排序更快並且成本更低。我的實驗支持,儘管這兩種算法都是O(n log(n))。那麼爲什麼不同的算法用於不同類型?爲什麼Java的Arrays.sort方法爲不同類型使用兩種不同的排序算法?
回答
最可能的原因:快速排序不是穩定,即相同的條目可以在排序期間改變它們的相對位置;除此之外,這意味着如果您排序已經排序的數組,它可能不會保持不變。
由於原始類型沒有身份(有沒有辦法區分兩個整數使用相同的值),這沒有關係他們。但對於參考類型,它可能會導致某些應用程序出現問題。因此,這些使用穩定的合併排序。
OTOH,一個理由不使用(保證的n * log(n))的合併排序基本類型可能是它需要使陣列的克隆。對於引用類型,通常引用的對象比引用數組佔用的內存要多得多,這通常不重要。但對於原始類型,徹底克隆該陣列會使內存使用量翻番。
使用快速排序的另一個原因是,在平均情況下,快速排序比mergesort快。儘管快速排序比mergesort做的更多,但它的數組訪問更少。如果輸入包含很多重複的條目,在實際應用中並不罕見(我的猜測是雙樞軸快速排序也具有此屬性),3路快速排序也可以實現線性時間。 – 2016-02-14 06:53:31
一個原因,我能想到的是,快速排序爲O的最壞情況下的時間複雜度(N^2),而歸併保留的O最壞情況時間(的n logñ)。對於對象數組,有一個公平的期望,會有多個重複的對象引用,這是快速排序最差的一種情況。
有一個體面的visual comparison of various algorithms,特別注意最右邊的圖了不同的算法。
我正在Coursera類的算法,並在講座鮑勃·塞奇威克教授提的Java系統排序評估的一個:
「如果程序員使用的對象,也許空間不是一個極爲 重要審議並通過合併排序也許 不是問題使用額外的空間。如果一個程序員使用原始類型,也許 性能是最重要的事情,所以他們使用的快速排序。」
這不是主要原因。在這句話之後,有一個問題嵌入到視頻中,關於「爲什麼參考類型使用MergeSort?」 (因爲它很穩定)。我認爲Sedgewick在視頻中沒有提到這個問題。 – likern 2015-07-26 17:48:07
根據this answer,Arrays#Sort()
引爲對象陣列的Java 7 API文檔現在使用TimSort,這是歸併和插入排序的混合體。另一方面,原始數組的Arrays#sort()
現在使用Dual-Pivot QuickSort。這些變化是在Java SE實現的開始7
Java的Arrays.sort
方法使用快速排序,插入排序和歸併。甚至在OpenJDK代碼中都實現了單個和雙重數據透視快速排序。最快的排序算法取決於具體情況,獲勝者是:小數組的插入排序(目前選擇47個),大多數排序數組的mergesort,剩餘數組的快速排序,因此Java的Array.sort()嘗試選擇最佳算法根據這些標準適用。
- 1. 爲兩種完全不同的類型編寫泛型方法
- 2. 這兩種任務方法的行爲有什麼不同?
- 3. 爲什麼這兩種方法的簽名不同?
- 4. 爲什麼這兩種方法返回不同的東西?
- 5. 爲什麼這兩種方法中的線程不同?
- 6. 爲什麼STL算法針對不同類別調用不同?
- 7. 在Java 6中有什麼不同的排序算法可用?
- 8. 爲什麼兩種不同的HTML5表單計算提交方法返回不同的行爲?
- 9. 使一種方法能夠採取兩種不同的類型作爲參數
- 10. 在排序算法中使用不同的數組類型
- 11. 爲什麼不同的結果來查詢兩種不同的寫法
- 12. 如何在Java方法中使用兩種不同的返回類型?
- 13. 顯示文本語法,兩種不同的方法,哪個更好,爲什麼?
- 14. AutoMapper - 不能用相同的方法映射兩種類型
- 15. 爲什麼Scala的Traversable有兩個稍微不同類型的copyToArray方法?
- 16. 兩種不同類型的
- 17. 爲什麼在jQuery/bootstrap中有兩種不同的語法?
- 18. Rails 4:按2種不同的作用域/類方法排序
- 19. 爲什麼有兩種不同類型的DataGridRow突出顯示顏色,爲什麼我無法控制它們?
- 20. 不同的方法類型?
- 21. 爲什麼這種方法向不同的用戶吐出相同的結果
- 22. 按不同命名的字段排序兩種不同型號
- 23. 在單獨的類中爲兩個不同的對象使用一種方法?
- 24. 如何在兩種不同的模型中使用where方法?
- 25. 使用Arrays.sort()方法排序對象類型數組
- 26. 3同步要求:爲什麼這種方法不起作用?
- 27. 爲什麼相同的MATLAB代碼運行不同的算法?
- 28. 爲什麼這種通用方法不接受任何類型?
- 29. Python的兩種不同的方法
- 30. 如何在java中使用不同類型的方法作爲另一種方法的參數?
快速排序最壞的情況是N^2不是NlogN。 – codaddict 2010-09-14 08:27:25
等一下,如果你有一個'Integer'或者什麼的數組會發生什麼? – 2010-09-14 08:30:28
這是不是解釋*在*你讀的來源? – 2010-09-14 10:11:49