归并排序

逆序数

https://ac.nowcoder.com/acm/problem/15163

算法思路:每个排序在统计时都会消除逆序对,好比冒泡排序法,如果交换位置就会造成逆序对的消失,为了效率,这里用归并排序,所以唯一的问题就是归并排序在哪消失了逆序对?

分析:

在左右两边的区间已经排好,只差合并的时候。
我们把1放到第一个的时候,在1前面的数字一定比他大。(这句话好好理解一下)
那么逆序对消失的个数就是之间的差值,上两个关键的函数。
以此我们就能去维护一个ans 去统计逆序对消失的个数,直到最后逆序对消失为0(排序完毕)。

void _merge(int l, int mid, int r)
{
    int p1 = l, p2 = mid + 1;
    for (int i = l; i <= r; i++)
    {
        if ((p1 <= mid) && (p2 > r) || (a[p1] <= a[p2]))
        {
            b[i] = a[p1++];
        }
        else
        {    
            ans +=(p2 - i);
            b[i] = a[p2++];
        }
    }
    for (int i = l; i <= r; i++)
    {
        a[i] = b[i];//b[i]临时数组
    }
}
void erfen(int l, int r)
{
    int mid = (l + r) >> 1;
    if (l < r)
    {
        erfen(l, mid);
        erfen(mid + 1, r);
    }
    _merge(l, mid, r);    
}
全部评论

相关推荐

03-27 17:33
门头沟学院 Java
代码飞升:同学院本,你要注意hr当天有没有回复过,早上投,还要打招呼要推销自己,不要一个劲投
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务