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;
}
相关文章推荐
- SDUT-3402 数据结构实验之排序五:归并求逆序数
- SDUT 3402:数据结构实验之排序五:归并求逆序数
- SDUT 3402 数据结构实验之排序五:归并求逆序数
- SDUT-数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- C语言 数据结构排序与查找 数据结构实验之排序五:归并求逆序数
- SDUT OJ 3402数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- (模板题)sdut 3402 数据结构实验之排序五:归并求逆序数(归并排序)
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 3402 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序五:归并求逆序数