Java Array.sort()源码分析讲解

 更新时间:2022年08月24日 11:51:27   作者:Log1119  
Arrays类中有一个sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用。但是sort()的参数有好几种,下面我就为大家一一介绍,这几种形式的用法

阅读起点:

Arrays.sort(nums1);

使用ctrl+左键进入sort()方法

1.Arrays.sort()

关于sort()的方法一共有14个,就目前调用的来看是以下这种最基础的。

 public static void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

2.DualPivotQuicksort

DualPivotQuicksort即双轴快排,定义了七种原始类型的排序方法。DualPivotQuicksort中使用了private DualPivotQuicksort() {},防止实例化,实现了sort方法并且定义了以下调整参数:

//归并排序的最大运行次数
private static final int MAX_RUN_COUNT = 67;
//归并排序的最大运行长度
private static final int MAX_RUN_LENGTH = 33;
//如果要排序的数组的长度小于该常数,则优先使用快速排序而不是归并排序
private static final int QUICKSORT_THRESHOLD = 286;
//如果要排序的数组的长度小于此常数,则优先使用插入排序而不是快速排序
private static final int INSERTION_SORT_THRESHOLD = 47;
//如果要排序的字节数组的长度大于该常数,则优先使用计数排序而不是插入排序
private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29;
//如果要排序的 short 或 char 数组的长度大于此常数,则优先使用计数排序而不是快速排序
private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;

3.DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);

该方法定义:

static void sort(int[] a, int left, int right,int[] work, int workBase, int workLen) {}

进入DualPivotQuicksort的sort方法:

 static void sort(int[] a, int left, int right,
                 int[] work, int workBase, int workLen) {
    // Use Quicksort on small arrays
    if (right - left < QUICKSORT_THRESHOLD) {
        sort(a, left, right, true);
        return;
    }

首先进行了判断,如果要排序的数组小于了之前定义的QUICKSORT_THRESHOLD=286,则优先使用快速排序而不是归并排序,即进入if中的排序sort(a, left, right, true);

4.DualPivotQuicksort.sort(a, left, right, true)

该方法定义:

private static void sort(int[] a, int left, int right, boolean leftmost){}

进入if中的sort(a, left, right, true)方法,我们只截取他的逻辑部分而非排序实现部分。

private static void sort(int[] a, int left, int right, boolean leftmost) {
    int length = right - left + 1;
    // Use insertion sort on tiny arrays
     if (leftmost) {
            /*
             * Traditional (without sentinel) insertion sort,
             * optimized for server VM, is used in case of
             * the leftmost part.
             */
            for (int i = left, j = i; i < right; j = ++i) {
                int ai = a[i + 1];
                while (ai < a[j]) {
                    a[j + 1] = a[j];
                    if (j-- == left) {
                        break;
                    }
                }
                a[j + 1] = ai;
            }
        } else {...........
		........

该方法中,首先判断了数组长度是否小于INSERTION_SORT_THRESHOLD=47,如果小于就使用插入排序,而不是快速排序。leftmost是来选择使用传统的(无标记)插入排序还是成对插入排序,leftmost是表示此部分是否在范围内的最左侧,因为我们最先开始调用的就是基础的sort,没有其他参数,所以就是从头开始排序,leftmost便默认为true,使用传统(无标记)插入排序,如果为false,使用成对插入排序。

5.总结

如果使用最基础的Arrays.sort(),那么排序中会根据数组的长度进行判断,数组越短,length<47,优先选择插入排序,其次length<286,选择快排,其次是归并排序。

到此这篇关于Java Array.sort()源码分析讲解的文章就介绍到这了,更多相关Java Array.sort()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Java中将List转换为String输出过程解析

    在Java中将List转换为String输出过程解析

    这篇文章主要介绍了在Java中将List转换为String输出过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java垃圾回收机制算法详解

    Java垃圾回收机制算法详解

    这篇文章主要介绍了Java垃圾回收机制算法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot快速设置拦截器并实现权限验证的方法

    SpringBoot快速设置拦截器并实现权限验证的方法

    本篇文章主要介绍了SpringBoot快速设置拦截器并实现权限验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 基于String变量的两种创建方式(详解)

    基于String变量的两种创建方式(详解)

    下面小编就为大家带来一篇基于String变量的两种创建方式(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java学习基础之安装JDK/配置JDK环境&IEDA工具安装

    Java学习基础之安装JDK/配置JDK环境&IEDA工具安装

    这篇文章主要介绍了Java学习基础系列文章的第一篇,主要内容是安装JDK/配置JDK环境&IEDA工具安装的相关资料,需要的朋友可以参考下
    2020-02-02
  • Spring中的ConversionService源码解析

    Spring中的ConversionService源码解析

    这篇文章主要介绍了Spring中的ConversionService源码解析,ConversionService是类型转换服务的接口,从名字就可以看出ConverterRegistry是要实现转换器注册表的接口,添加和移除Converter和GenericConverter,需要的朋友可以参考下
    2023-11-11
  • java定义数组的三种类型总结

    java定义数组的三种类型总结

    下面小编就为大家带来一篇java定义数组的三种类型总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java超详细讲解设计模式中的命令模式

    Java超详细讲解设计模式中的命令模式

    命令模式是将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者对请求做日志记录,以及可以支持撤销的操作
    2022-04-04
  • Spring Cloud Eureka 注册与发现操作步骤详解

    Spring Cloud Eureka 注册与发现操作步骤详解

    这篇文章主要介绍了Spring Cloud Eureka 注册与发现操作步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 比较排序之冒泡排序的实现

    比较排序之冒泡排序的实现

    下面小编就为大家带来一篇比较排序之冒泡排序的小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧实现。
    2017-06-06

最新评论