为什么Android/JavaAPI中的对象使用合并排序?
在Java中,原语类型使用快速排序。另一方面,对于对象,使用合并排序。同样,它也使用合并排序。集合排序在下面使用数组排序实现。所以,从简单的意义上说,我可以说原语是使用快速排序进行排序的,而对象是使用合并排序进行排序的 我猜这和它自己的排序算法有关。有很多关于快速排序和合并排序的讨论,比如和。似乎有相互矛盾的说法,哪一个更好,这是可以理解的,因为这取决于数据集 我的理解是为什么Android/JavaAPI中的对象使用合并排序?,java,android,sorting,quicksort,mergesort,Java,Android,Sorting,Quicksort,Mergesort,在Java中,原语类型使用快速排序。另一方面,对于对象,使用合并排序。同样,它也使用合并排序。集合排序在下面使用数组排序实现。所以,从简单的意义上说,我可以说原语是使用快速排序进行排序的,而对象是使用合并排序进行排序的 我猜这和它自己的排序算法有关。有很多关于快速排序和合并排序的讨论,比如和。似乎有相互矛盾的说法,哪一个更好,这是可以理解的,因为这取决于数据集 我的理解是 到位:快速排序获胜。对于链表,可以就地实现合并排序 外部存储数据:合并排序获胜 排序列表(由任何形式的链表支持):合并排序
- 到位:快速排序获胜。对于链表,可以就地实现合并排序
- 外部存储数据:合并排序获胜
- 排序列表(由任何形式的链表支持):合并排序获胜李>
public static void sort(Object[] array) {
ComparableTimSort.sort(array);
}
我不明白的是,是什么使Merge-sort成为Java或Android中对象排序的一个很好的候选者?为什么不把这个决定留给开发者呢 关键问题是排序稳定性——如果从排序顺序的角度来看,两个元素相等,那么它们在结果中的出现顺序是否与在输入中的出现顺序相同 例如,
long
,这并不重要。输入中3
的所有实例都将分组在一起,没有人关心哪个是哪个
另一方面,对象的不同方式可能不影响排序顺序。如果你是按腿数对动物进行分类,你可能会关心“猫”和“狗”是否保持原来的顺序
合并排序是稳定的。用于基本体的快速排序不需要是稳定的。合并排序是稳定的:相等的元素不会因排序而重新排序。请参见以下答案: TL;博士: 与合并排序相比,快速排序有两个主要缺陷:
我认为 是什么使合并排序成为排序Java对象和 对原语进行快速排序 其他人已经回答了这个问题,但是 为什么这个决定没有留给开发者 尚未得到解决 事实上,任何开发人员都可以轻松地从
Collection
或ArrayList
和隐藏sort()
方法派生出一个新类(因为sort()
必须是一个静态方法),并使用自己的自定义实现
这是很少(如果有)完成的事实,也许是因为当今大多数年轻程序员比C++更能接触java。在Java社区中,“抽象”意味着您不知道类的底层实现实际上是如何工作的,而且,您不需要这样做。JVM的机器独立性使我们对速度/效率的权衡失去了直觉。因此,我们中的许多人对数据结构和算法的理解不如一些更老、更有经验的程序员清楚
<>这与C++中抽象的理解几乎是相反的。引用亚历克斯·斯捷潘诺夫的话:
事实上,我不相信一个图书馆可以消除
程序员需要了解算法和数据结构。信息技术
只需要程序员来实现它们。需要
了解要使用的数据结构的基本属性
正确地使用它们,以便应用程序满足其自身的复杂性
要求
很好地解释了稳定排序的好处。
public static void sort(Object[] array) {
ComparableTimSort.sort(array);
}