c语言mergesort 参数,求教关于归并排序MergeSort()的问题

已结贴√

问题点数:20 回复次数:1

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

求教关于归并排序MergeSort()的问题

#include

#include

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

printf("%f ",p2[i]);

printf("\n");

for(i=0;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

{

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

{

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)的吧?

程序是可以用的,大家帮忙解释下,我非计算机专业,但是对这个感兴趣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值