数组中的逆序对——分治法(归并排序的应用)

【题目描述】
输入一个数组,求数组中逆序对的总数

【高效解法】
采用分治法,步骤上与归并排序一模一样
例{7, 5, 6, 4}
{7}和{5}产生1个逆序对(7, 5),按从小到大合并为{5, 7}
{6}和{4}产生1个逆序对(6, 4),按从小到大合并为{4, 6}
以{5, 7}和{4, 6}说明merge函数的流程

Step1

Step2

Step3

Step4

综上{7, 5, 6, 4}共有5个逆序对

【merge函数】

int merge( int p, int q, int r )
{
    int n1 = q - p + 1, n2 = r - q;
    int i, j, result = 0;

    L[0] = -INF;
    for( i = 1; i <= n1; i++ )
        L[i] = s[p + i - 1];

    R[0] = -INF;
    for( j = 1; j <= n2; j++ )
        R[j] = s[q + j];

    i = n1;
    j = n2;

    for( int k = r; k >= p; k-- )
        if( L[i] > R[j] )
        {
            result += j;
            s[k] = L[i];
            i--;
        }
        else
        {
            s[k] = R[j];
            j--;
        }

    return result;
}

【merge_sort函数】

int merge_sort( int p, int r )
{
    int result = 0;

    if( p < r )
    {
        int q = ( p + r ) / 2;
        result += merge_sort( p, q );
        result += merge_sort( q + 1, r );
        result += merge( p, q, r );
    }

    return result;
}

【练习】
nowcoder 数组中的逆序对
注意事项:vector对象作为函数参数时,需要加&符号,即定义为vector<int> &data,表示对象的别名为data,否则会对vector对象进行复制,造成TLE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值