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
今日推荐
周排行