归并排序求逆序对

感觉写的很不错的板子

void sort(int *s,int l,int r)
{
    if(l==r) return;    //区间长度为1时返回

    int mid = l+r>>1;   //对左右区间进行排序
    sort(s,l,mid);
    sort(s,mid+1,r);

    int a[mid-l+1],b[r-mid],l1,l2,i,j,k;        //复制左右区间
    l1 = 0;l2 = 0;k = l;
    for(i = l;i <= mid;i ++)   a[++l1] = s[i];
    for(i = mid+1;i <= r;i ++) b[++l2] = s[i];

    i = 1;j = 1;                                //合并放入原数组
    while(i<=l1&&j<=l2)
    {
        if(a[i]<=b[j]) s[k++] = a[i++];
        else
        {
            s[k++] = b[j++];
            ans+=(l1-i+1);
        }
    }
    while(i<=l1) s[k++] = a[i++];
    while(j<=l2) s[k++] = b[j++];
}

猜你喜欢

转载自blog.csdn.net/qq_30358129/article/details/79242846