在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。
分析:
方法1:暴力循环,时间复杂度为O(n2)
方法2:利用堆排序的思想,首先将数组拆分到底,然后在合并的过程中排序,同时计算逆序对的数量
以下是java代码的实现
package leetcode;
public class Pairs {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] A={3,2,5,6,9,4};
int result=split(A,0,A.length-1);
System.out.println(result);
}
public static int split(int[] A,int left,int right){
int result=0;
if(left>=right) return result;
int mid=(left+right)/2;
result+=split(A,left,mid);
result+=split(A,mid+1,right);
result+=merge(A,left,right,mid);
return result;
}
public static int merge(int[] A,int left,int right,int mid){
int result=0;
int[] temp=new int[right-left+1];
int i=mid,j=right,k=0;
//计算逆序对的数量,同时排序
while(i>=left && j>mid){
if(A[i]>A[j]){
result+=(j-mid);
temp[k++]=A[i--];
}
else{
temp[k++]=A[j--];
}
}
while(i>=left){
temp[k++]=A[i--];
}
while(j>mid){
temp[k++]=A[j--];
}
//将数组排好序,供下次下次循环使用
for(int m=left;m<=right;m++){
A[m]=temp[--k];
}
return result;
}
}