Collections(2)

countRunAndMakeAscending方法的简介

首先我们要明白一个概念:run。

RUN

run:一个最长的按升序排列的序列;或者一个最长的按严格的降序排列的序列。
run形式:
0) a[lo] <= a[lo + 1] <= a[lo + 2] <= …(升序形式)
1) a[lo] > a[lo + 1] > a[lo + 2] > … (严格的降序形式)

Code Segment

    @SuppressWarnings({"uncheck", "rawtypes"})
    private static int countRunAndMakeAscending(Object[] a, int lo, int hi){
        assert lo < hi;
        int runHi = lo + 1;
        if(runHi == hi)
            return 1;
        //Find end of run, and reverse range if descending
        if(((Comparable) a[runHi++]).compareTo(a[lo]) < 0){ // Descending
            while(runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi -1]) < 0)
                runHi++;
            reverseRange(a, lo, runHi);
        } esle {                         //Ascending
            while(runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi -1]) >= 0)
                runHi++;
        }

        return runHi - lo;
    }

Notes:
0) 元素是可以相互比较的,即是实现接口Comparable;
1) 该方法是返回一个run的长度;
2) 注意在判断升序还是降序的if中runHi;
3) reverseRange方法是从两端收敛于(数组的)中间。

下一节将介绍“mini-TimSort”,即是countRunAndMakeAscending和binarySort的综合使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值