当前位置: 首页 > 面试题库 >

为什么合并排序用于Android / Java API中的对象?

漆雕深
2023-03-14
问题内容

在Java中,原始类型的Arrays.sort()使用快速排序。另一方面,对象的Arrays.sort()使用合并排序。而且,同样使用Merge排序的Collection.sort()也是如此。集合排序使用下面的数组排序实现。因此,从简单的意义上讲,我可以说基元是使用快速排序来排序的,而对象是使用合并排序来排序的。

我的猜测是它与自身的排序算法有关。上有快速的SO如此多的讨论排序VS归并排序,像这样和这个。似乎有相互矛盾的主张,哪一种更好,这是可以理解的,因为这取决于数据集。

我的理解是

  • 到位:快速排序获胜。合并排序可以就地实现链接列表
  • 外部存储数据:合并排序获胜。
  • 排序列表(由任何形式的链接列表支持):合并排序获胜。链接

Android
API似乎遵循与Java相同的模式。这是我在Arrays.java中找到的

    public static void sort(long[] array) {
    DualPivotQuicksort.sort(array);
}

还有这个,

public static void sort(Object[] array) {
    ComparableTimSort.sort(array);
}

我不明白的是,是什么使Merge成为Java或Android中对对象进行排序的良好候选者?为什么不将这个决定留给开发人员呢?


问题答案:

关键问题是排序稳定性-如果从排序顺序的角度来看两个html" target="_blank">元素相等,那么它们在结果中的显示顺序是否与输入中的顺序相同。

例如没关系long3输入中的所有实例将被分组在一起,没有人关心哪个是哪个。

另一方面,对象可能在不影响排序顺序的方式上有所不同。如果按腿数对动物进行分类,则可能会担心“猫”和“狗”是否保持原始顺序。

该Arrays.sort归并排序是稳定的。用于原语的快速排序不需要稳定。



 类似资料:
  • 我正在维基百科上阅读关于外部排序的文章,我需要理解为什么两阶段合并比一阶段合并更有效。 Wiki:但是,单次合并有一个限制。随着区块数量的增加,我们将内存分成更多的缓冲区,因此每个缓冲区都较小,因此我们必须进行许多较小的读取,而不是较少的较大读取。 因此,对于100 MB内存中的50 GB的排序,使用单个合并过程是没有效率的:磁盘需要用500个数据块中的每个数据块(我们一次从每个数据块读取100M

  • 问题内容: 我们知道快速排序是最快的排序算法。 JDK6 使用合并排序算法而不是快速排序。但是Arrays.sort使用快速排序算法。 Collections.sort使用合并排序而不是快速排序的原因是什么? 问题答案: 极有可能从乔希布洛赫§: 我确实写了这些方法,所以我想我有资格回答。确实没有最佳的排序算法。与mergesort相比,QuickSort有两个主要缺陷: 它不稳定(如parsif

  • 我从这里得到了帮助,但我特别不想宣布我的方法无效。任何帮助都将不胜感激! 这是我的合并排序的实现,我得到的输出是5 4 3 2 1 10 9 8 7 6。 有人能帮我弄清楚我该怎么做吗? 我不想将mergesort和merge方法声明为void,而是希望它们返回排序后的数组。提前谢谢。

  • 问题:Mergesort将一个数字列表分成两半,并对这两个数字进行递归调用。相反,您能在左半部分执行quicksort,在右半部分执行mergesort吗?如果是,则通过显示每个步骤来显示它将如何对下面的数字列表进行排序。如果没有,请解释为什么不能。 Iam应该使用MergeSort对数字列表进行排序。左半部分将使用快速排序进行排序? 我想出来了。安:是的,我们可以 使用mergeSort对数组的

  • 我读过这些话: 为了使动态规划适用,一个问题必须具有两个关键属性:最优子结构和重叠子问题。如果一个问题可以通过组合非重叠子问题的最优解来解决,那么这个策略就叫做“分而治之”。这也是为什么mergesort和quicksort没有被归类为动态规划问题的原因。 我有三个问题: 为什么合并排序和快速排序不是动态编程? 我认为合并排序也可以将小问题和小问题分开,然后做同样的事情等等。 Dijkstra算法

  • 我第一次用一个辅助数组实现了合并排序,以尝试使用JavaScript实现可视化。这似乎应该是有效的,但它不是。任何帮助或提示将不胜感激。 编辑:我忘了包括它不起作用的情况。它们是: 输入:[4, 2, 5, 6, 7, 7]输出:[4, 2, 5, 6, 7, 7] 输入:[6,6,6,4,6,2]输出:[4,6,6,6,6,2] 输入:[6, 7, 3, 10, 7, 9, 6, 3, 4, 6