求逆序对的模板(分治法)

int ans = 0;
void merges(int *a, int lef, int righ)
{
    if(lef == righ)       /*边界*/
        return ;

    int mid = lef + (righ - lef) / 2;

    merges(a, lef, mid);        /*递归左半*/
    merges(a, mid + 1, righ);       /*递归右半*/

    /*接下来合并*/
    int totalSize = righ - lef + 1;
    int tmp[totalSize];
    int n = lef;
    int m = mid + 1;
    int i = 0;
    while(n <= mid || m <= righ)
    {
        /*右半为空 || 左半不为空且左半值小于右半值*/
        if(m > righ || (n <= mid && a[n] <= a[m]))
            tmp[i++] = a[n++];      /*将左半部分复制到临时空间*/
        else        /*当前面的元素大于后一个元素时就会进入这个判断语句c*/
        {
            tmp[i++] = a[m++];
            ans += mid - n + 1;
        }

    }
    n = lef;
    for(int i = 0; i < totalSize; i++)
        a[n++] = tmp[i];

}

这个更清楚

posted @ 2019-05-06 21:29  DIY-Z  阅读(342)  评论(0编辑  收藏  举报