首页 > 编程语言 > 详细

归并算法实现求解逆序对【模板】

时间:2015-08-05 12:36:54      阅读:203      评论:0      收藏:0      [点我收藏+]

已用此模板过掉了好几题。

#include<stdio.h>
#define LL long long //以后可以考虑这样写 简洁

int n,i,a[500010], b[500010];
//需要开辟两个数组

LL count(int l,int r)//统计[l ,r]的逆序对数
{
    LL s=0;//初始化
    int mid=(l+r)/2, i=l, j=mid+1, k=l;
    //printf("%d \n", mid );

    if (l<mid) s+=count(l,mid);//计算累加左区间的逆序对
    if (mid+1<r) s+=count(mid+1,r);//计算累加右区间的逆序对

    while( i<=mid || j<=r )
    {
        while ( i<=mid && (j>r || a[i]<=a[j]) ){
            //printf("%d < %d", a[i], a[j] ); //左边理应小于右边(左边等级低 右边等级高)
            b[k++]=a[i++];
        }
        while ( j<=r && (i>mid || a[j]<a[i]) )
        {                        //右边的大于左边的进行计数
           // printf(" %d-<-%d ", a[j], a[i] );
            b[k++]=a[j++];
            s+=mid-i+1;
        }
    }
    for(i=l;i<=r;i++)
        a[i]=b[i];
    return s;
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for (i=0; i<n; i++)
            scanf("%d", &a[i]);
        printf("%lld\n", count(0,n-1));
    }
    return 0;
}

 

归并算法实现求解逆序对【模板】

原文:http://www.cnblogs.com/yspworld/p/4704171.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!