第一种解题思路就是暴力解决,在这就不进行代码演示,着重采用分治的思想进行解决问题。
采用分治的思想进行处理
1、将数组通过递归划分成左右区间基本相等的状态
2、将划分好的左右区间进行合并
3、在合并的过程中,计算左右区间上产生的逆序对
4、因为保证每一步合并的区间都是排列好的,所以,如果满足一个逆序对时,则这个数后面的逆序对也同样满足,这时候就可以省略掉
注意:进行分治的治时,一定要对原数组进行覆盖,只有这样才能递归分出正确答案
static int num=0;
static final long h=1000000007;
public int InversePairs(int [] array) {
InversePairs_huafen(array,0,array.length-1);
return num;
}
private static void InversePairs_huafen(int[] array, int start, int end) {
if (start>=end){
return;
}
int mid=(start+end)/2;
InversePairs_huafen(array,start,mid);
InversePairs_huafen(array,mid+1,end);
InversePairs_mix(array,start,mid,end);
}
private static void InversePairs_mix(int[] array, int start, int mid, int end) {
int[]a=new int[end-start+1];
//设置数组的边界点
int i=start,j=mid+1,k=0;
//循环,保证i的值在左区间,j的值在右区间上
while (i<=mid&&j<=end){
//如果左区间的值大于有区间,就满足了逆序对的关系
if (array[i]>array[j]){
a[k++]=array[j++];
//如果存在逆序对,同时这个区间是有序区间,则其后面的值也与当前值构成逆序对
num= (int) ((num+mid-i+1)%h);
}else {
a[k++]=array[i++];
}
}
while (i<=mid){
a[k++]=array[i++];
}
while (j<=end){
a[k++]=array[j++];
}
for (k=0;k<a.length;k++){
array[start+k]=a[k];
}
}
}