【发布时间】:2021-01-24 16:10:58
【问题描述】:
你们能帮我处理这段代码吗?我知道这是基本的,但我现在真的很迷恋它。我正在尝试实现一个非常简单的合并排序版本,但是输出全错了。请尝试修复此代码,而不是编写一个全新的代码。
#include <stdio.h>
void merge_them(int a[], int l, int m, int r)
{
int i=l, j=m+1;
int final[r-l+1];
int p=0;
for(int k=0; k<=r-l+1; k++)
{
if(a[i]<a[j])
{
final[p]=a[i];
i++;
p++;
}
else if(a[i]>=a[j])
{
final[p]=a[j];
j++;
p++;
}
}
j=0;
for( i=l; i<r+1; i++)
{
a[i]=final[j];
j++;
}
}
void merge(int a[], int l, int r)
{
if(l<r)
{
int m = (l+r)/2;
merge(a,l,m);
merge(a,m+1,r);
merge_them(a,l,m,r);
}
}
int main()
{
int a[10] = {10,9,8,7,6,5,4,3,2,1};
merge(a,0,9);
for(int i=0; i<10; i++)
printf("%d ",a[i]);
}
更新:这不是家庭作业。我只是重新审视一些基于递归的排序算法,并尝试实现合并排序。无论如何,我切换到 while 循环并使用了更精确的条件检查,这导致了正确的排序输出。
【问题讨论】:
-
"但是输出全错了。" 请说得更具体些。描述一些输入、程序的输出和预期输出。
-
添加大量单元测试,然后将调试器附加到失败的测试中:-)
-
不相关,
final是一个不好的变量名选择,它是一个keyword。 -
这似乎是家庭作业。我们不是为此而来的。你试过什么?什么没有特别有效?您是否尝试过使用调试器?