我正在做一個基於比較的合併分析算法,它按照升序輸出。我注意到它是更快(比較少),當我給它一個反向排序列表,而不是升序排序列表。有人可以解釋爲什麼嗎?爲什麼合併排序比正常排序列表排序更快?
3
A
回答
2
您的排序代碼中必須有錯誤。
根據我的理解,通過文字MergeSort執行的比較次數應該是獨立的的數據。這意味着它不能比O(n log n)
差,但也不會更好(除非你做了一些聰明的修改,比如在「自然mergesort」或TimSort中)。
2
要合併兩個長度爲M和N的列表,最多需要M + N-1個比較。如果第一個列表中的所有條目都小於第二個列表中的條目,則只需要M個比較。如果第二個列表中的所有條目都小於第一個列表中的條目,則只需要N個比較。
如果您正在排序的總數量不是2的效價,那麼您將遇到將您劃分爲兩個不同長度的列表的情況。我懷疑你實現了合併排序的方式,其中第一個有更多的元素。這意味着對於該分區和合並,M = N + 1。如果元素的順序相反,則第二個列表中的所有元素都將小於第一個列表中的元素,並且在正確順序的情況下,您需要N個比較而不是M個比較。
如果你想排序的列表是2的效價,正常順序和逆序之間應該沒有區別。
相關問題
- 1. 爲什麼插入排序比合並排序更快?
- 2. 爲什麼我的選擇排序比插入排序更快?
- 3. 爲什麼冒泡排序比快速排序快
- 4. 合併排序的方式比插入排序更快謎題
- 5. 什麼排序技術在合併時使用合併排序
- 6. FirstChance異常StackOverFlow合併排序外殼排序泡沫排序
- 7. Java - 爲什麼我的Bubble排序比我的插入排序更快?
- 8. 爲什麼在實踐中插入排序比Bubble Sort和堆排序更快?
- 9. 快速排序比慢的std ::排序
- 10. 合併排序列表java
- 11. 合併和排序列表
- 12. 合併排序的列表
- 13. 排序和合並列表
- 14. 合併排序列表
- 15. 在選擇排序,插入排序,合併排序和快速排序中計數比較?
- 16. 爲什麼我的合併排序代碼比插入排序慢
- 17. 如何排序比快速排序更快的整數數組?
- 18. 什麼是最快的快速排序 - 排序算法的排名表?
- 19. 合併排序:使用混合元素排序列表
- 20. 爲什麼歸併排序使用Java來排序的陣列比元件7
- 21. 合併然後進行排序或排序然後合併會更快嗎?
- 22. 爲什麼快速排序按降序排序和升序排序需要更長的時間
- 23. 合併排序
- 24. 快速排序在排序列表上花費更長時間
- 25. 合併列表和「合併」排序
- 26. 如何將合併排序轉換爲並行合併排序
- 27. 爲什麼這個快速排序不排序
- 28. 快速排序不排序
- 29. 爲什麼Javascript的Bubble排序比其他排序算法快得多?
- 30. Golang自定義排序比本地排序更快
http://stackoverflow.com/q/11227809/758280 – Jeffrey
@Jeffrey我假設他正在計算比較的次數(他寫的「比較少」),這應該排除分支預測。 –
我其實只是有同樣的情況,其中比較的數量恰好是在倒序數組上的數組長度。隨機數組和排序數組的比較次數遵循n(log(n))模式。 –