/*
牛客
剑指offer
JZ35 逆序对的个数
*/
public class Solution {
public int InversePairs(int [] array) {
this.sort(array);
return count;
}
private int count=0;
//将两个有序数组合并成一个有序数组的方法
public int[] guibing(int[] left, int[] right) {
int temp[] = new int[left.length + right.length]; //定义一个零时数组存放治后的数据
int t = 0;
int i = 0;
int j = 0;
while ((i < left.length) && (j < right.length)) {
if (left[i] < right[j]) {
temp[t] = left[i];
i++;
} else {
temp[t] = right[j];
j++;
count = (count + left.length- i)%1000000007; //防止数据超范围
}
t++;
}
while ((i >= left.length) && (t < temp.length)) {
temp[t] = right[j];
j++;
t++;
}
while ((j >= right.length) && (t < temp.length)) {
temp[t] = left[i];
i++;
t++;
}
return temp; // 返回值类型要与定义时相同
}
//归并排序
//给一个数组返回一个有序数组方法
public void sort(int arr[]) {
int[][] b = new int[arr.length][]; //数组的数组 二维数组
int i = 0;
for (i = 0; i < arr.length; i++) {
b[i] = new int[]{arr[i]};
}
while(b.length>1) {
int n = 0;
int[][] a;
if(b.length % 2 == 0) { //针对个数为偶
a = new int[b.length / 2][];
for (int k = 0; k < b.length - 1; ) {
a[n] = guibing(b[k], b[k + 1]); //数组合并
n++;
k = k + 2;
}
} else {
a = new int[b.length/ 2+ 1 ][]; //针对个数为奇
int k=0;
for (k = 0; k < b.length - 2; ) {
a[n] = guibing(b[k], b[k + 1]); //数组合并
n++;
k = k + 2;
}
a[b.length/ 2]=b[k]; //将原数组最后一个直接给新数组最后一个
}
b = a;
}
}
}