您的位置:首页 > 理论基础 > 数据结构算法

sdut 数据结构实验之排序五:归并求逆序数

2016-11-21 12:06 204 查看
#include<stdio.h>
#include<stdlib.h>
long long ans;
int a[100010],temp[100010];
void merge(int s1,int e1,int s2,int e2)
{
int p1,p2,p;
p=0;p1=s1;p2=s2;
while(p1<=e1&&p2<=e2)
{
if(a[p1]<=a[p2])
temp[p++]=a[p1++];
else
{
temp[p++]=a[p2++];
ans+=e1-p1+1;//此时a[p2]比p1前面e1-p2个数都大
}
}
while(p1<=e1)
temp[p++]=a[p1++];
while(p2<=e2)
temp[p++]=a[p2++];
int i;
for(i=s1;i<=e2;i++)
a[i]=temp[i-s1];
}

void merge_sort(int s,int e)
{
int m;
if(s<e)
{
m=(s+e)/2;
merge_sort(s,m);
merge_sort(m+1,e);
merge(s,m,m+1,e);
}
}

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

自己的精简写好然而WA,蓝瘦。。。。

#include<stdio.h>
int ans=0;
int b[100000],a[1000000],n;
void merge_sort(int *a,int *b,int x,int y)
{
if(y-x>1)
{
int m=x+(y-x)/2;//中间点的坐标
int p=x,q=m,i=x;
merge_sort(a,b,x,m);
merge_sort(a,b,m,y);
while(p<m&&q<y)
{
if(a[p]<=a[q])
{
p++;
continue;
}
else
{
q++;
ans+=m-p;
}
}
}
}
int main()
{

while(~scanf("%d",&n)){
ans=0;
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
merge_sort(a,b,0,n);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: