数组中的逆序对
题目: 有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组总的逆序对个数。
给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000.
测试如下
{1, 8, 9, 6, 3, 4, 2, 1}
返回:4
分治思想
采用归并排序的思路来处理,先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要对数组进行排序,其实这个排序过程就是归并排序的思路。
public static int reverPairNumber(int[] arr){
return process(arr,0,arr.length-1);
}
public static int process(int[] arr,int left,int right) {
if(left==right){
return 0;
}
int mid=left+((right-left)>>1);
return process(arr,left,mid)+
process(arr,mid+1,right)+
+merge(arr,left,mid,right);
}
public static int merge(int[] arr,int L,int M,int R){
int[] help=new int[R-L+1];
int res=0;
int i=0;
int p1=L;
int p2=M+1;
while(p1<=M&&p2<=R){
res=arr[p1]>arr[p2]?1:0;
help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=M){
help[i++]=arr[p1++];
}
while(p2<=R){
help[i++]=arr[p2++];
}
return res;
}