Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Android/JavaAPI中的对象使用合并排序?_Java_Android_Sorting_Quicksort_Mergesort - Fatal编程技术网

为什么Android/JavaAPI中的对象使用合并排序?

为什么Android/JavaAPI中的对象使用合并排序?,java,android,sorting,quicksort,mergesort,Java,Android,Sorting,Quicksort,Mergesort,在Java中,原语类型使用快速排序。另一方面,对于对象,使用合并排序。同样,它也使用合并排序。集合排序在下面使用数组排序实现。所以,从简单的意义上说,我可以说原语是使用快速排序进行排序的,而对象是使用合并排序进行排序的 我猜这和它自己的排序算法有关。有很多关于快速排序和合并排序的讨论,比如和。似乎有相互矛盾的说法,哪一个更好,这是可以理解的,因为这取决于数据集 我的理解是 到位:快速排序获胜。对于链表,可以就地实现合并排序 外部存储数据:合并排序获胜 排序列表(由任何形式的链表支持):合并排序

在Java中,原语类型使用快速排序。另一方面,对于对象,使用合并排序。同样,它也使用合并排序。集合排序在下面使用数组排序实现。所以,从简单的意义上说,我可以说原语是使用快速排序进行排序的,而对象是使用合并排序进行排序的

我猜这和它自己的排序算法有关。有很多关于快速排序和合并排序的讨论,比如和。似乎有相互矛盾的说法,哪一个更好,这是可以理解的,因为这取决于数据集

我的理解是

  • 到位:快速排序获胜。对于链表,可以就地实现合并排序
  • 外部存储数据:合并排序获胜
  • 排序列表(由任何形式的链表支持):合并排序获胜
Android API似乎遵循与Java相同的模式。这就是我发现的

而这个,

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

我不明白的是,是什么使Merge-sort成为Java或Android中对象排序的一个很好的候选者?为什么不把这个决定留给开发者呢

关键问题是排序稳定性——如果从排序顺序的角度来看,两个元素相等,那么它们在结果中的出现顺序是否与在输入中的出现顺序相同

例如,
long
,这并不重要。输入中
3
的所有实例都将分组在一起,没有人关心哪个是哪个

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


合并排序是稳定的。用于基本体的快速排序不需要是稳定的。

合并排序是稳定的:相等的元素不会因排序而重新排序。

请参见以下答案:

TL;博士:

与合并排序相比,快速排序有两个主要缺陷:

  • 它不稳定(正如帕西法尔所指出的)
  • 它不保证n log n性能;它可以退化为病理输入的二次性能

  • 我认为

    是什么使合并排序成为排序Java对象和 对原语进行快速排序

    其他人已经回答了这个问题,但是

    为什么这个决定没有留给开发者

    尚未得到解决

    事实上,任何开发人员都可以轻松地从
    Collection
    ArrayList
    隐藏
    sort()
    方法派生出一个新类(因为
    sort()
    必须是一个
    静态方法),并使用自己的自定义实现

    这是很少(如果有)完成的事实,也许是因为当今大多数年轻程序员比C++更能接触java。在Java社区中,“抽象”意味着您不知道类的底层实现实际上是如何工作的,而且,您不需要这样做。JVM的机器独立性使我们对速度/效率的权衡失去了直觉。因此,我们中的许多人对数据结构和算法的理解不如一些更老、更有经验的程序员清楚

    <>这与C++中抽象的理解几乎是相反的。引用亚历克斯·斯捷潘诺夫的话:

    事实上,我不相信一个图书馆可以消除 程序员需要了解算法和数据结构。信息技术 只需要程序员来实现它们。需要 了解要使用的数据结构的基本属性 正确地使用它们,以便应用程序满足其自身的复杂性 要求


    很好地解释了稳定排序的好处。
    public static void sort(Object[] array) {
        ComparableTimSort.sort(array);
    }