#include<stdio.h>
void msort(long *a,long *t,long begin,long end)
{
long mid=(begin+end)/2,p=begin,q=mid+1,i=begin;
if(begin<end)
{
msort(a,t,begin,mid);
msort(a,t,mid+1,end);
while(i<=end)
{
if(q>end||a[p]<=a[q]) t[i++]=a[p++];
else t[i++]=a[q++];
}
for(long i=begin;i<=end;i++) a[i]=t[i];
}
}
int main()
{
//*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
//*/
const long maxn=108;
long n=0,a[maxn],t[maxn];
bool first=true;
while(scanf("%ld",&a[n+1])==1) n++;
// Read In
msort(a,t,1,n);
// M_sort
for(long i=1;i<=n;i++)
{
if(first) first=false;
else printf(" ");
printf("%ld",a[i]);
}
putchar('\n');
return 0;
}
在上面的归并排序程序的基础上,很容易修改得出求一个序列逆序对个数的程序。
以下是我的代码,只给出函数,main()与上面的基本相同:
long count(long *a,long *t,long begin,long end)
{
long mid=(begin+end)/2,p=begin,q=mid+1,i=begin,re=0;
if(begin<end)
{
re+=count(a,t,begin,mid);
re+=count(a,t,mid+1,end);
while(i<=end)
{
if(q>end||a[p]<=a[q]) t[i++]=a[p++];
else
{
t[i++]=a[q++];
re+=mid-p+1;
}
}
for(long i=begin;i<=end;i++) a[i]=t[i];
}
return re;
}
posted on 2010-01-09 18:26
lee1r 阅读(352)
评论(0) 编辑 收藏 引用 所属分类:
算法与数据结构