归并排序
要求:
对数组进行排序
思路:
把数组对半分,把对半分的数组再次对半分,分到最后子数组长度为1的时候开始按照有序规则,合并两个数组,递归返回,最后合并成一个大的有序数组
代码:
//归并排序
public static int[] mergeSort(int[] arr) {
if (arr.length < 2) return arr;
int[] arr1 = Arrays.copyOfRange(arr, 0, arr.length / 2);
int[] arr2 = Arrays.copyOfRange(arr, arr.length / 2, arr.length);
arr1 = mergeSort(arr1);
arr2 = mergeSort(arr2);
return combine(arr1, arr2);
}
//合并函数
private static int[] combine(int[] arr1, int[] arr2) {
int[] arr = new int[arr1.length + arr2.length];
for (int i = 0, j = 0, k = 0; k < arr.length; k++) {
int temp;
if (arr1.length <= i) temp = arr2[j++];
else if (arr2.length <= j) temp = arr1[i++];
else if (arr1[i] < arr2[j]) temp = arr1[i++];
else temp = arr2[j++];
arr[k] = temp;
}
return arr;
}
数组中的逆序对
要求:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
思路:
利用分治的思想,把数组对半拆分知道长度为1再合并,在合并的过程排序并统计逆序对
代码:
import java.util.Arrays;
public class Solution {
int sum = 0;
public int InversePairs(int [] array) {
get(array);
return sum%1000000007;
}
int[] get(int[] arr){
if (arr.length<=1) return arr;
int[] arr1 = Arrays.copyOfRange(arr,0,arr.length/2);
int[] arr2 = Arrays.copyOfRange(arr,arr.length/2,arr.length);
arr1 = get(arr1);
arr2 = get(arr2);
return combine(arr1,arr2);
}
//边归并排序边统计逆序对
int[] combine(int[] arr1,int[] arr2){
int a[] = new int[arr1.length+arr2.length];
int i1 = arr1.length-1;
int i2 = arr2.length-1;
for(int i = a.length-1;i>=0;i--){
if (i1<0) a[i] = arr2[i2--];
else if (i2<0) a[i] = arr1[i1--];
else if(arr1[i1]>arr2[i2]) {
a[i] = arr1[i1--];
sum+=(i2+1);
sum = sum%1000000007;
}
else a[i] = arr2[i2--];
}
return a;
}
}