模板 - 算法基础 - 归并排序

不羁的心 提交于 2019-12-05 00:39:45

归并排序求逆序数,注意逆序数可能有n^2级别。按照惯例,所有的自写函数均为闭区间

ll MergeSort(int *a, int l, int r) {
    if(l == r)
        return 0;
    int m = l + r >> 1;
    ll res = 0;
    res += MergeSort(a, l, m);
    res += MergeSort(a, m + 1, r);
    int i = l, j = m + 1, k = 0;
    while(i <= m || j <= r) {
        if(i > m)
            tmp[++k] = a[j++];
        else if(j > r)
            tmp[++k] = a[i++];
        else if(a[i] < a[j])
            tmp[++k] = a[i++];
        else {
            res += m - i + 1;
            tmp[++k] = a[j++];
        }
    }
    for(int i = 1; i <= k; ++i)
        a[l + i - 1] = tmp[i];
    return res;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!