在Java中使用Arrays.sort()方法代替快速排序或合并排序的缺点
我刚刚做了一个数组问题,那里的解决方案使用了快速排序,但我使用了Arrays.sort()方法。现在我认为Arrays.sort()对基本类型使用快速排序,对对象类型使用mergesort。 那么,使用 Arrays.sort() 方法直接在java中使用,而不是为快速或合并排序执行整个实现。或者,如果两者都相同,为什么要执行冗长的实现而不是使用array.sort()方法?除非您确实需要(通过测量证明)更有效的实现,并且可以想出一个,使用在Java中使用Arrays.sort()方法代替快速排序或合并排序的缺点,java,arrays,sorting,Java,Arrays,Sorting,我刚刚做了一个数组问题,那里的解决方案使用了快速排序,但我使用了Arrays.sort()方法。现在我认为Arrays.sort()对基本类型使用快速排序,对对象类型使用mergesort。 那么,使用 Arrays.sort() 方法直接在java中使用,而不是为快速或合并排序执行整个实现。或者,如果两者都相同,为什么要执行冗长的实现而不是使用array.sort()方法?除非您确实需要(通过测量证明)更有效的实现,并且可以想出一个,使用数组。排序总是更有意义。它是有效的和经过良好测试的。实现
数组。排序总是更有意义。它是有效的和经过良好测试的。实现快速排序或合并排序几乎毫无意义,因为它们是通用排序算法。实现一个定制的排序算法可能是有意义的,该算法使用Java无法使用的数据的某些属性(计数排序和桶排序就是很好的例子)
对于Arrays.sort
,Oracle实现的工作原理如下:
对于int
、long
、float
和double
基本上有三种算法:插入排序、双枢轴稳定快速排序和合并排序
1.1。如果数组足够大(当前大于286个元素),并且没有“几乎排序”(动态确定),则使用合并排序
1.2。否则,如果数组非常小(当前少于47个元素),则使用插入排序
1.3。否则(如果数组不是那么小,但小于286个元素或大部分已排序),则使用双枢轴快速排序
对于short
和char
,有插入排序、双枢轴稳定快速排序和计数排序
2.1。如果数组大于某个阈值(当前为3200个元素),则使用计数排序
2.2。否则,与较大的类型类似,将使用插入排序或双枢轴稳定快速排序(使用47个元素的阈值)
对于字节,这与shorts类似,但当有超过29个元素时使用计数排序(因为它不需要那么多内存)
对于引用类型,事情很复杂
4.1。如果设置了java.util.Arrays.useLegacyMergeSort
属性,则会使用某种旧式合并排序(出人意料地),这会在非常小的数组(少于7个元素)上返回到插入排序
4.2。否则,使用TimSort(),这类似于Merge-Sort,但对于少于32个对象的数组,不执行合并
上面的观点是,Java人真正做了他们的研究,而不是盲目地实现一个随机排序算法,希望每个人都会喜欢它
根据我的经验,我发现array.sort
非常有效。我可以想到实现自定义算法的两个原因:前面提到的使用某些数据属性的情况,以及对不同“并行”数组中的数据进行排序,无论出于何种原因(性能,或者我们可能只是无法控制生成这些数组的代码),我们都无法将这些数据合并到一个复合对象数组中。它是有效的和经过良好测试的。实现快速排序或合并排序几乎毫无意义,因为它们是通用排序算法。实现一个定制的排序算法可能是有意义的,该算法使用Java无法使用的数据的某些属性(计数排序和桶排序就是很好的例子)
对于Arrays.sort
,Oracle实现的工作原理如下:
对于int
、long
、float
和double
基本上有三种算法:插入排序、双枢轴稳定快速排序和合并排序
1.1。如果数组足够大(当前大于286个元素),并且没有“几乎排序”(动态确定),则使用合并排序
1.2。否则,如果数组非常小(当前少于47个元素),则使用插入排序
1.3。否则(如果数组不是那么小,但小于286个元素或大部分已排序),则使用双枢轴快速排序
对于short
和char
,有插入排序、双枢轴稳定快速排序和计数排序
2.1。如果数组大于某个阈值(当前为3200个元素),则使用计数排序
2.2。否则,与较大的类型类似,将使用插入排序或双枢轴稳定快速排序(使用47个元素的阈值)
对于字节,这与shorts类似,但当有超过29个元素时使用计数排序(因为它不需要那么多内存)
对于引用类型,事情很复杂
4.1。如果设置了java.util.Arrays.useLegacyMergeSort
属性,则会使用某种旧式合并排序(出人意料地),这会在非常小的数组(少于7个元素)上返回到插入排序
4.2。否则,使用TimSort(),这类似于Merge-Sort,但对于少于32个对象的数组,不执行合并
上面的观点是,Java人真正做了他们的研究,而不是盲目地实现一个随机排序算法,希望每个人都会喜欢它
根据我的经验,我发现array.sort
非常有效。我可以想到实现自定义算法的两个原因:前面提到的使用某些数据属性的情况,以及对来自不同“并行”数组的数据进行排序,我们无法将这些数据合并到一个复合对象数组中