Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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
在Java中使用Arrays.sort()方法代替快速排序或合并排序的缺点_Java_Arrays_Sorting - Fatal编程技术网

在Java中使用Arrays.sort()方法代替快速排序或合并排序的缺点

在Java中使用Arrays.sort()方法代替快速排序或合并排序的缺点,java,arrays,sorting,Java,Arrays,Sorting,我刚刚做了一个数组问题,那里的解决方案使用了快速排序,但我使用了Arrays.sort()方法。现在我认为Arrays.sort()对基本类型使用快速排序,对对象类型使用mergesort。 那么,使用 Arrays.sort() 方法直接在java中使用,而不是为快速或合并排序执行整个实现。或者,如果两者都相同,为什么要执行冗长的实现而不是使用array.sort()方法?除非您确实需要(通过测量证明)更有效的实现,并且可以想出一个,使用数组。排序总是更有意义。它是有效的和经过良好测试的。实现

我刚刚做了一个数组问题,那里的解决方案使用了快速排序,但我使用了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
    非常有效。我可以想到实现自定义算法的两个原因:前面提到的使用某些数据属性的情况,以及对来自不同“并行”数组的数据进行排序,我们无法将这些数据合并到一个复合对象数组中