我正在做一个基于比较的合并分析算法,它按照升序输出。我注意到它是更快(比较少),当我给它一个反向排序列表,而不是升序排序列表。有人可以解释为什么吗?为什么合并排序比正常排序列表排序更快?
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))模式。 –