
因为不满意教材里的分函数实现和声明过多的冗余变量。我重写了一下二路归并排序算法。
//merge_sort.c
#include<stdio.h>
#include<stdlib.h>
int merge_sort(int a[],int n)
{
int x,k,u1,u2,i1,i2;
int *b=(int *)calloc(n,sizeof(int));
if(b==0){puts("memory allocation error.\n");exit(1);}
for(x=1;x<n;x*=2)
{
k=0;
for(u1=x;u1<n;u1=u2+x)
{
u2=u1+x;
if(u2>=n)u2=n;
for(i1=u1-x,i2=u1;i1<u1&&i2<u2;k++)
if(a[i1]<=a[i2])b[k]=a[i1++];
else b[k]=a[i2++];
while(i1<u1)b[k++]=a[i1++];
while(i2<u2)b[k++]=a[i2++];
}
for(i1=0;i1<k;i1++)a[i1]=b[i1];
}
free(b);
return 0;
}
丑陋的行内赋值。我犯了一个低级的错误:误把第8行的b==0写成了b=0,gcc没有任何提示。运行就出现Segmentation fault.至少困扰了我1个小时。

No comments:
Post a Comment