逆序对统计 利用归并排序的方法

import java.util.*;

public class AntiOrder {
    public int count(int[] A, int n) {
        // write code here
        return helper(A,0,n-1);
    }
    
    public int helper(int[] a,int start, int end){
        if(end<=start) return 0;
        int mid = (start+end)/2;
        int cnt1 = helper(a,start,mid);
        int cnt2 = helper(a,mid+1,end);
        return cnt1+cnt2+merge(a,start,mid,end);
    }
    
    int merge(int[] a,int start,int mid,int end){
        int[] arr = new int[end-start+1];
        int i = start,  j = mid+1;  //i j分别为左右区间的起点
        int k = 0; //合并数组的指针
        int cnt = 0; //逆序对个数
        while(i<=mid && j<=end){
            if(a[i] <= a[j]){  //i小,入队
                arr[k++] = a[i++];
            }
            else{
                cnt += mid-i+1;   //关键点 若a[i]>a[j],并且左边数组中i+1到mid都比i大,则一下都算上
                arr[k++] = a[j++];
            }
        }
        while(i<=mid)
            arr[k++] = a[i++];
        while(j<=end)
            arr[k++] = a[j++];

        for(int t=0;t<arr.length;t++)
            a[start+t] = arr[t];
        return cnt;
    }
    
}

猜你喜欢

转载自blog.csdn.net/weixin_42246923/article/details/80852966