Java 6的Arrays.sort
方法对基元数组使用Quicksort,对对象数组使用合并sort。我相信大多数时候,Quicksort比合并排序要快,并且占用的内存更少。我的实验支持这一点,尽管两种算法都是O(n log(n))。那么为什么对不同类型使用不同的算法呢?
Integer
s 数组或其他东西,会发生什么?
Java 6的Arrays.sort
方法对基元数组使用Quicksort,对对象数组使用合并sort。我相信大多数时候,Quicksort比合并排序要快,并且占用的内存更少。我的实验支持这一点,尽管两种算法都是O(n log(n))。那么为什么对不同类型使用不同的算法呢?
Integer
s 数组或其他东西,会发生什么?
Answers:
最可能的原因是:快速排序不稳定,即相等的条目可以在排序过程中更改其相对位置;除其他外,这意味着,如果对已排序的数组进行排序,则它可能不会保持不变。
由于基本类型没有身份(无法区分具有相同值的两个int),因此这对它们无关紧要。但是对于引用类型,它可能会在某些应用程序中引起问题。因此,对于那些使用稳定的合并排序。
OTOH,不对原始类型使用(保证的n * log(n))稳定合并排序的一个原因可能是它需要克隆该数组。对于引用类型,引用的对象通常比引用数组占用更多的内存,这通常没有关系。但是对于原始类型,完全克隆数组会使内存使用量增加一倍。
java.util.Arrays使用quicksort为原始类型如int和归并为实现对象可比或使用比较器。使用两种不同方法的想法是,如果程序员使用的对象空间可能不是至关重要的考虑因素,那么mergesort所使用的额外空间可能就不是问题,并且如果程序员使用的是原始类型,那么性能可能是最重要的事情。在快速排序。
例如:这是排序稳定性很重要的示例。
这就是为什么稳定排序对对象类型有意义,尤其是可变对象类型和具有比排序键更多的数据的对象类型的原因,而mergesort就是这样的排序。但是对于原始类型,稳定性不仅无关紧要。没有意义的
资源: INFO