题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
思路:这个题目就是用的归并排序的思想,在归并排序中,我们需要对两个排好序的数组进行重新排序,如果数组A和数组B,A中第j个数小于B中第i个数,那么在A中第j个数到最后一个数都是和B中第i个数组成逆序数;
程序:
Copy:
//归并排序
int num=0;
public int InversePairs(int [] array){
mergeSort(array);
return num%1000000007;
}
public void mergeSort(int[] array){
int[] temArray=new int[array.length];
mergeSort(0,array.length-1,array,temArray);
}
public void mergeSort(int left,int right,int[] array,int[] temArray){
if(left>=right)
return;
else{
int mid=(left+right)/2;
mergeSort(left,mid,array,temArray);
mergeSort(mid+1,right,array,temArray);
merge(left,mid,right,array,temArray);
}
}
private void merge(int leftStart, int leftEnd, int rightEnd, int[] array, int[] temArray) {
int left= leftStart;
int temStart=leftStart;
int rightStart=leftEnd+1;
int length=rightEnd-leftStart+1;
while(leftStart<=leftEnd&&rightStart<=rightEnd){
if(array[leftStart]<=array[rightStart])
temArray[temStart++]=array[leftStart++];
else{
temArray[temStart++]=array[rightStart++];
num+=leftEnd-leftStart+1;
if(num>1000000007)
num%=1000000007;
}
}
while(leftStart<=leftEnd){
temArray[temStart++]=array[leftStart++];
// num+=leftEnd-leftStart+1;
}
while(rightStart<=rightEnd){
temArray[temStart++]=array[rightStart++];
}
for(int i=0;i<length;i++){
array[left]=temArray[left++];
}
}