递归内部执行顺序--归并--逆序对的数量

逆序对数量
一直不了解内部分治的调用顺序,因此画图调用

题目:
在这里插入图片描述
代码

package 大学菜;

import java.util.Scanner;

public class 逆序对数量 {

    static int num= 100010;
    static int[] tmp = new int[num];
    static long number =0 ;

    //pu
    public static int sort(int[] A,int l,int r){
        //判断
        if(l>=r){return 0;}
        //先分再治
        int middle = l+r >>1;
        //治
        sort(A,l,middle);
        sort(A,middle+1,r);
        //
        int k=0;
        int i=l;
        int j = middle+1;
        while (i<=middle && j<=r){
            if (A[i] <=A[j]) {
                tmp[k++] = A[i++];
            }else {
                number = number+middle-i+1;//对j来说,则mid-i+1是当前j的所有逆序对
                tmp[k++] = A[j++];//A[i]>A[j]&&i<j
            }
        }
        while (i<=middle){tmp[k++]= A[i++];}
        while (j<=r){tmp[k++] = A[j++];}
        //现在只是临时数组
        for(int I=l,K=0;I<=r;I++,K++){
            A[I] = tmp[K];
        }
        return (int) number;
    }
    //zhu
    public static void main(String[] args) {
        //
        Scanner sc= new Scanner(System.in);
        int N = sc.nextInt();
        int[] A = new int[N];
        for(int i= 0;i<N;i++){
            A[i] = sc.nextInt();
        }
        int m = sort(A,0,N-1);
        System.out.println(m);

    }
}

内部的调用过程
例如说
A = [5,4 ,3,2,1]
sz2wqMerge(0,4)->Merge(0,2)->Merge(0,1)-Merge(0,0) 满足条件

return Merge(0,1)–》Merge(1,1)
满足条件
return执行Merge(0,1)接下来的代码-计算出number 1
return Merge(0,2)->Merge(2,2)满足条件
return Merge(0,2)执行下面的代码,计算出number 1+2
return Merge(0,4) ->Merge(3,4)->Merge(3,3)->Merge(4,4)
return Merge(3,4)->执行下面的代码计算出number 1+2 +1
return Merge(0,4)->执行下面的代码 计算出number 1+2+1+6

每次都是执行到最小子空间后返回,分解成两个有序的空间再进行计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值