归并排序解决逆序对问题(java实现,递归方式)

什么是递归排序

递归排序是一种基于递归的排序算法,它通过将待排序的元素分解成更小的子问题,然后递归地解决这些子问题来实现排序。递归排序的基本思想是将待排序的元素分解成更小的子问题,然后递归地解决这些子问题,直到所有子问题都被解决为止。
在这里插入图片描述

###递归排序的基本步骤如下:

1.将待排序的元素分解成更小的子问题,例如将整数分解成整数和小数。
2.对于每个子问题,递归地解决它,直到所有子问题都被解决为止。
3.将所有子问题的解合并起来,得到最终的排序结果。

逆序对问题

问题描述:
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

代码实现

  public static int merge(int[]arr){
        if (arr == null || arr.length < 2){
            return 0;
        }
        return process(arr,0,arr.length - 1);
    }

递归方法调用

 public static int process(int[]arr,int L,int R){
        //base case
        if (L == R){
            return 0;
        }
        int mid = L + ((R - L ) >> 1);
        return process(arr,L,mid)+
                process(arr,mid+1,R)
                +mergeSort(arr,L,mid,R);
    }

分治后合并的过程

 public static int mergeSort(int[]arr,int L,int M,int R){
        int p1 = M;
        int p2 = R;
        int ans = 0;

        int[]help = new int[R - L + 1];
        int i = help.length - 1;
        while(p1 >= L && p2 > M){
            ans += arr[p1] > arr[p2] ? (p2 - M) : 0;
            help[i--]= arr[p1] > arr[p2] ? arr[p1--] : arr[p2--];

        }
        while (p1 >= L){
            help[i--] = arr[p1--];
        }
        while (p2 > M){
            help[i--] = arr[p2--];
        }
        for (i = 0; i < help.length;i++){
            arr[L + i]  = help[i];
        }
        return ans;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值