今天尝试根据书上给的归并排序算法伪代码编写一下程序进行测试。源代码如下:
struct Array
{
int *arr;
int len;
};
struct Array A;
void Initial(struct Array & A) //这里的形参一定要申明为引用,否则函数内部对A.len的改动实际会不奏效
{
int n,i;
printf("insert an integer n:");
scanf("%d",&n);
A.len=n;
A.arr=(int )malloc(sizeof(int)A.len);
printf("insert n number of integers:");
for(i=0; i<A.len; i++)
{
scanf("%d",&A.arr[i]);
}
}
void Show(struct Array A)
{
int i;
printf("the array is:");
for(i=0; i<A.len; i++)
{
printf("%d ",A.arr[i]);
}
printf("\n");
}
void Merge(int arr[],int p,int q,int r)
{
int n1=q-p+1,n2=r-q;
int L[n1+1],R[n2+1];
int i,j,k;
for(i=0; i<n1; i++)
{
L[i]=arr[p+i];
}
for(j=0; j<n2; j++)
{
R[j]=arr[q+1+j];
}
i=0;
j=0;
L[n1]=INT_MAX;
L[n2]=INT_MAX;
for(k=p; k<=r; k++)
{
if(L[i]<R[j])
{
arr[k]=L[i];
i++;
}
else
{
arr[k]=R[j];
j++;
}
}
}
void Merge_Sort(int arr[],int p,int r)
{
if(p<r)
{
int q=(r-p)/2;
Merge_Sort(arr,p,q);
Merge_Sort(arr,q+1,r);
Merge(arr,p,q,r);
return;
}
else
return;
}
int main()
{
Initial(A);
Merge_Sort(A.arr,0,A.len-1);
Show(A);
return 0;
}
首先编译正确,但运行没有输出。运行单步调试后发现在Merge_Sort函数在第一次调用Merge函数之前程序都是正常的,但调用Merge函数后单步调试箭头直接指向了Merge函数体内的尾部,然后程序自动终止了。检查了很久的代码就得没有问题,算法也是根据书上来的,同时自己验证过。不知道错误是不是出现在函数调用上?