归并排序(解决逆序对问题)

归并排序(解决逆序对问题)

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值