在Java中使用Arrays.sort()方法而不是QuickSort或MergeSort的缺点

时间:2016-04-17 12:24:07

标签: java arrays sorting

我只是在做一个数组问题而且那里的解决方案使用了quicksort但我改为使用了Arrays.sort()方法。现在我认为Arrays.sort()使用带有基本类型的quicksort和对象类型的mergesort。 那么使用

有什么缺点
  

Arrays.sort()

直接在java中的方法,而不是为Quick或merge sort做整个实现。如果两者相同,为什么要执行冗长的实现而不是使用Arrays.sort()方法?

1 个答案:

答案 0 :(得分:7)

除非你真的需要(通过测量证明)更有效的实现,可以提出一个,使用Arrays.sort总是更有意义。它高效且经过充分测试。实现Quicksort或Merge Sort几乎没有任何意义,因为它们是通用的排序算法。实现一个自定义排序算法可能是有意义的,该算法使用Java无法使用的数据属性(计算排序和存储桶排序是很好的例子)。

对于Arrays.sort,Oracle实现的工作原理如下:

  1. 对于intlongfloatdouble,基本上有三种算法:Insertion Sort,Dual-Pivot Stable Quicksort和Merge Sort。
  2. 1.1。如果数组足够大(当前大于286个元素)它不是“几乎排序”(动态确定),那么然后使用合并排序。

    1.2。否则,如果数组非常小(目前少于47个元素),则使用“插入排序”。

    1.3。否则(如果数组不是那么小,但是小于286个元素或大多数是排序的),则使用Dual-Pivot Quicksort。

    1. 对于shortchar,有插入排序,双枢轴稳定快速排序和计数排序。
    2. 2.1。如果数组大于某个阈值(当前为3200个元素),则使用Counting Sort。

      2.2。否则,与较大类型类似,使用Insertion Sort或Dual-Pivot Stable Quicksort(使用47个元素的阈值)。

      1. 对于字节,它就像是短裤一样,但是当有超过29个元素时使用Counting Sort(因为它不需要那么多内存)。

      2. 对于参考类型,事情很复杂。

      3. 4.1。如果设置了java.util.Arrays.useLegacyMergeSort属性,则会使用某种遗留的合并排序(令人惊讶),这可以追溯到非常小的数组(少于7个元素)上的插入排序。

        4.2。否则,使用TimSort(Tim Pieter's list sort for Python),类似于Merge Sort,但对于少于32个对象的数组,不执行合并。

        上述观点是Java人员确实进行了研究,而不是盲目地实施随机排序算法,希望每个人都对此感到满意。

        根据我的经验,我发现Arrays.sort非常有效率。我可以想到实现自定义算法的两个原因:前面提到的使用某些数据属性的情况,以及对不同“并行”数组中的数据进行排序,这些数据由于某种原因我们无法合并到一个复合对象数组中(性能,或者也许我们只是无法控制产生这些数组的代码。)