首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java & Merge排序

Java & Merge排序
EN

Stack Overflow用户
提问于 2010-08-01 15:03:14
回答 3查看 2.4K关注 0票数 3

为什么Java impl选择合并排序而不是快速排序?为什么他们要将内容复制到数组中?

接口:“排序算法是一种改进的合并排序算法(如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。该实现将指定的列表转储到一个数组中,对该数组进行排序,并遍历该列表,从该数组中的相应位置重新设置每个元素。这避免了尝试对链表进行原地排序所导致的n2 log(n)性能。”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-01 15:07:35

Java专家在最坏的情况下使用了avg,正如您可能知道的那样,在最坏的情况下,快速排序可能会运行O(n^2)。

您可以读入API,就地对链表进行排序更加复杂n^2log(n)

合并排序是稳定的,这对于快速排序的有效版本是不正确的。(这在对对象进行排序时非常重要,因为许多程序员在使用Collections.sort()时认为这是理所当然的)

票数 8
EN

Stack Overflow用户

发布于 2010-08-01 15:47:10

我认为选择mergesort的主要原因是因为它很稳定。

其他人提到的n log n最坏情况保证是一个优势,但它可能不是主要原因。如果查看Arrays.sort方法,就会发现原语上的所有排序都使用quicksort,而Object[]上的排序使用mergesort。这是因为稳定的排序对于基元来说并不重要;相等的基元彼此之间不能区分。

票数 4
EN

Stack Overflow用户

发布于 2010-08-01 15:09:33

  • 合并排序保证了O(n log n)行为。快速排序的最坏情况性能为O(n^2)。所以在某些情况下,合并排序速度更快,并且有更好的上限。
  • 像快速排序这样的就地排序在链表上不起作用,正如你的引言所提到的那样。若要对所有类型的集合进行可预测的工作,需要一个副本。
  • 快速排序本身并不稳定。稳定性有时是可取的,也是API应该提供的东西。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3381108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档