Java源码之Arrays内部排序实现(timsort的实现)

本文深入解析Java中Arrays.sort()方法的实现,重点讨论Timsort算法。当处理对象数组时,Java 8使用Timsort,一种结合了归并排序和插入排序的稳定排序算法。对于小数组,Timsort使用二分插入排序;对于大数组,它通过识别和合并已排序或部分排序的子序列(run)来提高效率。文章通过示例详细解释了Timsort的工作原理和步骤。
摘要由CSDN通过智能技术生成

在Arrays工作类里有sort()方法可以用来排序,jdk对所有基本类型设置设置了不同入参sort方法进行支持。
这里写图片描述
从源码上看,基本类型的排序都是使用了了DualPivotQuicksort的排序方法(我看的是jdk8,)。DualPivotQuicksort是快排的一种优化,具体在这里不展开了。
当参数类型为对象数组时,在原来的版本使用的归并排序(以后将会删除 ),现在使用的timSort。

  public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a);
        else
            ComparableTimSort.sort(a);
    }
    //以后会抛弃,也不展开了,大家可以自己去看下归并排序
    /** To be removed in a future release. */
    private static void legacyMergeSort(Object[] a) {
        Object[] aux = a.clone();
        mergeSort(aux, a, 0, a.length, 0);
    }

所以排序主要用了 ComparableTimSort.sort(Object[] a)。分为下面几个主要步骤:

数组个数小于32的情况
  1. 判断数组的大小,小于32使用二分插入排序
static void sort(Object[] a, int lo, int hi) {
        //检查lo,hi的的准确性
        rangeCheck(a.length, lo, hi);
        int nRemaining  = hi - lo;

        //当长度为0或1时永远都是已经排序状态
        if (nRemaining < 2)
            return;

        // 数组小的时候
        if (nRemaining < MIN_MERGE) {
            //找出连续升序的最大个数
            int initRunLen = countRunAndMakeAscending(a, lo, hi);
            //二分插入排序
            binarySort(a, lo, hi, lo + initRunLen);
            return;
        }

        //数组大于32的时
       ......
  1. 找出最大的递增或者递减的个数,如果递减,则此段数组严格反一下方向
  private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {
        
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值