归并排序(解决逆序对问题)
1.归并排序
归并排序采用了分治的思想,将一个数组平均地分为两份,通过递归的方式使得这两个数组变得有序,再将这两个有序数组合并。
2.逆序对问题
给你一个数组,其中任意两个数满足 i<j且 a[i]>a[j],则将这一对数成为逆序对,现求该数组有多少组逆序对。
3.解决思路
在归并排序的递归过程中,始终是将两个有序数组进行合并,设i,j为数组a,b的索引,a数组在原数组中位于b数组之前。建立一个新队列,当a[i]<=b[j]时,则将a[i]push进新队列并删除a数组中的a[i],当a[i]>b[j]时,则将b[j]push进新队列并删除b数组中的b[j],同时这两个数满足逆序对要求,又因为a为有序数组,a[i]后的元素均大于b[j],所以逆序对数增加a数组的长度。所以在归并排序中可解决逆序对问题。
4.js实现
let nums = 0;
function sort(arr, left, right) {
if(left == right) return [arr[left]];
const mid = left + Math.floor((right-left)/2);
let arr1 = sort(arr,left,mid);
let arr2 = sort(arr,mid+1,right);
let arr3 = [];
while(arr1.length&&arr2.length) {
if(arr1[0]<=arr2[0]) arr3.push(arr1.shift());
else {
arr3.push(arr2.shift());
nums = (nums+arr1.length) % 1000000007;
}
}
while(arr1.length) arr3.push(arr1.shift());
while(arr2.length) arr3.push(arr2.shift());
return arr3;
}
function InversePairs(data)
{
let arr = sort(data,0,data.length-1);
return nums;
}