题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
public class Solution {
int cnt=0;
public int InversePairs(int [] array) {
if(array.length != 0){
divide(array,0,array.length-1);
}
return cnt;
}
public void divide(int[] array,int start,int end){
//递归终止条件
if(start >= end) return;
//取中
int mid=start+(end-start)/2;
//分
divide(array,start,mid);
divide(array,mid+1,end);
//治
merge(array,start,mid,end);
}
public void merge(int[] array,int start,int mid,int end){
//临时数组
int[] tmp=new int[end-start+1];
//i和j表示两个分数组的左下标,k表示临时数组的当前下标
int i=start,j=mid+1,k=0;
while(i<=mid && j<= end){
//如果前小于后,则存前,前右移
if(array[i]<=array[j]){
tmp[k++]=array[i++];
}
//如果前大于后,则存后,后右移-------***此时存在逆序对,要进行比较
else{
tmp[k++]=array[j++];
//如果此时前大于后,那么现有前到最后的元素都会大于后
cnt=(cnt+mid-i+1)%1000000007;
}
}
//未遍历完的直接放在右侧
while(i<=mid){
tmp[k++]=array[i++];
}
while(j<=end){
tmp[k++]=array[j++];
}
// 将临时数组的值覆盖原来数组
for( k=0;k<tmp.length;k++){
array[start+k]=tmp[k];
}
}
}
#归并排序#

