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

归并排序求逆序数,注意逆序数可能有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;
}
posted @ 2019-11-19 20:04  KisekiPurin2019  阅读(85)  评论(0编辑  收藏  举报