jz51 数组中的逆序对

public class Solution {
        /*
    思路:
    归并排序,分治法(divide,merge)。
    divide用mergeSort递归方法实现。
    
    可以举{1,2,3,4,5,6,7,0}的例子
    1.先分割为单个元素,然后再排序拼起来
    2.在merge中,需要temp数组来进行当前的排序
    用i,j指针来进行排序。小的放前面。
    如果前面的大,说明这就是一队逆序数。
    i,j超出范围后,剩下都是大的,直接复制过来。
    3.全程是把原数组array传递的,
    最后把temp覆盖到array对应的位置
    4.最后实现array的排序和逆序对数的统计
    */
    int res = 0;
    
    public int InversePairs(int [] array) {
        //归并排序(mergeSort),分治法(divide,merge)
        //divide由递归mergeSort实现
        mergeSort(array,0,array.length-1);
        return res;
    }
    
    public void mergeSort(int[] array,int start,int end){
        //start=end为单个元素。start>end在这边没找到对应哪种情况
        if(start >= end) return;
        int mid = start + (end-start)/2;
        //分(用递归megerSort来实现)
        mergeSort(array,start,mid);
        mergeSort(array,mid+1,end);
        //把原数组传过去进行修改(这样才能实现排序)
        merge(array,start,mid,end);
    }
    
    //举例,可以直接跳到最后一层(数据比较多,好验证)
    public void merge(int[] array,int start,int mid,int end){
        //创建辅助排序的temp数组
        int[] tempArray = new int[end-start+1];
        //k为tempArray下标,抄别抄错了
        int i = start,j = mid+1,k = 0;
        //i,j的范围
        while(i <= mid && j <= end){
            //等号可能没用
            if(array[i] <= array[j]){
                tempArray[k++] = array[i++];
            }else{
                tempArray[k++] = array[j++];
                //逆序对数为i到mid,个数为mid-i+1
                //是从array[i]开始比较的,所以起点为i
                //注意的是:每次加完mid-i+1后,都要对1000000007取模
                res = (res + mid-i+1) % 1000000007;
            }
        }
        //i,j一旦一个超出范围,说明后面的都是大的,直接复制过来
        while(i <= mid) tempArray[k++] = array[i++];
        while(j <= end) tempArray[k++] = array[j++];
        //把tempArray覆盖到原数组array的部分(从start开始)
        for(k = 0;k < tempArray.length;k++){
            array[start+k] = tempArray[k];
        }
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值