求教关于归并排序MergeSort()的问题
#include<stdio.h>#include<stdlib.h>
void InputArray(float *p,int n);
void C_MergeSort(float *p1,int low,int middle,int high,float *p2);
void MergeSort(float *p1,int low,int high,float *p2);
int main(void)
{
float *p1=NULL,*p2=NULL;
int i,n;
printf("Enter n:");
scanf("%d",&n);
p1=(float*)malloc(n*sizeof(float));
p2=(float*)calloc(n,sizeof(float));
if(p1==NULL)
{
printf("No enough memory!\n");
exit(1);
}
if(p2==NULL)
{
printf("No enough memory!\n");
exit(1);
}
InputArray(p1,n);
MergeSort(p1,0,n-1,p2);
for(i=0;i<n;i++)
printf("%f ",p2[i]);
printf("\n");
for(i=0;i<n;i++)
printf("%f ",p2[i]);
printf("\n");
free(p1);
free(p2);
system("pause");
return(0);
}
void InputArray(float *p,int n)
{
int i;
printf("Enter an array whose length is %d:\n",n);
for(i=0;i<n;i++)
{
scanf("%f",&p[i]);
}
}
void C_MergeSort(float *p1,int low,int middle,int high,float *p2)
{
int i=low,j=middle+1,k=low;
while(i<=middle && j<=high)
{
if(p1[i]>p1[j])
{
p2[k++]=p1[j++];
while(j==high+1 && i<=middle)
{
p2[k++]=p1[i++];
}
}
else
{
p2[k++]=p1[i++];
while(i==middle+1 && j<=high)
{
p2[k++]=p1[j++];
}
}
}
for(i=0;i<=high;i++) //关键
p1[i]=p2[i];
}
void MergeSort(float *p1,int low,int high,float *p2)
{
int middle=(low+high)/2;
printf("low=%d,middle=%d,high=%d\n",low,middle,high); //打印,看看规律
if(low<high)
{
MergeSort(p1,low,middle,p2); //注意MergeSort和C_MergeSort的顺序
MergeSort(p1,middle+1,high,p2);
C_MergeSort(p1,low,middle,high,p2);
}
}
最后一个部分,即MergeSort是参考书上的
我有一个疑问,用例子说明
{5, 3, 6, 1}。
MergeSort分裂为{5, 3}和{6, 1}
MergeSort分裂{5, 3}为{5}, {3};分裂{6, 1}为{6}, {1}
现在递归已经到头,因为继续分的话low>high
所以运行C_MergeSort,合并{5}, {3}为{3, 5};合并{6}, {1}为{1, 6}
退到上一层递归,合并{3, 5}和{1, 6}为{1, 3, 5, 6}。
问题是,在MergeSort中,当运行了C_MergeSort,C_MergeSort的后面什么都没有了,不是直接下去了吗?还有反复调用函数啊?
还有,在MergeSort中,当运行了MergeSort(p1,low,middle,p2),要等到它执行完,才轮到MergeSort(p1,middle+1,high,p2)的吧?
程序是可以用的,大家帮忙解释下,我非计算机专业,但是对这个感兴趣。