public class Solution {
/*
思路:
归并排序,分治法(divide,merge)。
divide用mergeSort递归方法实现。
可以举{1,2,3,4,5,6,7,0}的例子
1.先分割为单个元素,然后再排序拼起来
2.在merge中,需要temp数组来进行当前的排序
用i,j指针来进行排序。小的放前面。
如果前面的大,说明这就是一队逆序数。
i,j超出范围后,剩下都是大的,直接复制过来。
3.全程是把原数组array传递的,
最后把temp覆盖到array对应的位置
4.最后实现array的排序和逆序对数的统计
*/
int res = 0;
public int InversePairs(int [] array) {
//归并排序(mergeSort),分治法(divide,merge)
//divide由递归mergeSort实现
mergeSort(array,0,array.length-1);
return res;
}
public void mergeSort(int[] array,int start,int end){
//start=end为单个元素。start>end在这边没找到对应哪种情况
if(start >= end) return;
int mid = start + (end-start)/2;
//分(用递归megerSort来实现)
mergeSort(array,start,mid);
mergeSort(array,mid+1,end);
//把原数组传过去进行修改(这样才能实现排序)
merge(array,start,mid,end);
}
//举例,可以直接跳到最后一层(数据比较多,好验证)
public void merge(int[] array,int start,int mid,int end){
//创建辅助排序的temp数组
int[] tempArray = new int[end-start+1];
//k为tempArray下标,抄别抄错了
int i = start,j = mid+1,k = 0;
//i,j的范围
while(i <= mid && j <= end){
//等号可能没用
if(array[i] <= array[j]){
tempArray[k++] = array[i++];
}else{
tempArray[k++] = array[j++];
//逆序对数为i到mid,个数为mid-i+1
//是从array[i]开始比较的,所以起点为i
//注意的是:每次加完mid-i+1后,都要对1000000007取模
res = (res + mid-i+1) % 1000000007;
}
}
//i,j一旦一个超出范围,说明后面的都是大的,直接复制过来
while(i <= mid) tempArray[k++] = array[i++];
while(j <= end) tempArray[k++] = array[j++];
//把tempArray覆盖到原数组array的部分(从start开始)
for(k = 0;k < tempArray.length;k++){
array[start+k] = tempArray[k];
}
}
}
jz51 数组中的逆序对
最新推荐文章于 2024-07-10 07:29:59 发布