用归并排序来做即可。递归mergesort,最后merge
public class Solution {
private long sumcount = 0;
public int InversePairs(int [] array) {
int[] temp = new int[array.length];
mergeSort(array,0,array.length-1,temp);
return (int)(sumcount%1000000007);
}
public void mergeSort(int[] array,int left,int right,int[] temp){
if(left<right){
int mid = (left+right)/2;
mergeSort(array,left,mid,temp);
mergeSort(array,mid+1,right,temp);
merge(array,left,mid,right,temp);
}
}
public void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left;
int j = mid+1;
int t = 0; //辅助数组的索引
//比较i和j处的数据
while (i<=mid && j<=right){
if(arr[i]<arr[j]){
temp[t++]=arr[i++];
}else{
temp[t++]=arr[j++];
sumcount += (mid-i+1);
}
}
//把剩下的移过去
while (i<=mid){
//左边有剩余
temp[t++]=arr[i++];
sumcount += (right-j+1);
}
while (j<=right){
//右边有剩余
temp[t++]=arr[j++];
}
//把temp弄回到arr
t=0;
int tempLeft = left;
while (tempLeft<=right){
arr[tempLeft++]=temp[t++];
}
}
}