- 题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 - 输入:
5 4 3 2 1 输出:
10思想:
本质上是归并排序,只是在每次当mid右半部的数小于mid前半部某个数i时(mid,i都是下标),统计逆序对count=mid-i+1算法代码:
public class InversePairs_Solution {
public int InversePairs(int [] array) {
if(array.length<=0)
return 0;
return mergesort(array,0,array.length-1);
}
public int mergesort(int[] array,int l,int r){
if(l>=r){
return 0;
}
int mid=(l+r)/2;
//左半排序,并返回该部分存在的逆序数
int lnums=mergesort(array,l,mid);
//右半排序,并返回该部分存在的逆序数
int rnums=mergesort(array,mid+1,r);
//左右归并,并返回逆序对数
return lnums+rnums+merge(array,l,mid,r);
}
public int merge(int[] array,int l,int mid,int r){
int [] temp = new int[r-l+1];
int count=0;
int i=l,j=mid+1,t=0;
while(i<=mid||j<=r){
if(i>mid&&j<=r){
temp[t++]=array[j++];
continue;
}else if(i<=mid&&j>r){
temp[t++]=array[i++];
continue;
}
if(array[i]>array[j]){//统计逆序对数
temp[t++]=array[j++];
count+=mid-i+1;
}else {
temp[t++]=array[i++];
}
}
for(i=l;i<=r;i++){
array[i]=temp[i-l];
}
return count;
}
public static void main(String[] args) {
InversePairs_Solution cls = new InversePairs_Solution();
int[] array= {5,4,3,2,1};
System.out.println(cls.InversePairs(array));
System.out.println(java.util.Arrays.toString(array));
}
}