【问题标题】:A bug in merge sort [closed]合并排序中的错误[关闭]
【发布时间】: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
  • 这似乎是家庭作业。我们不是为此而来的。你试过什么?什么没有特别有效?您是否尝试过使用调试器?

标签: c algorithm sorting


【解决方案1】:

实际上存在三个错误:

  • for 语句中的条件k&lt;=r-l+1 是错误的,它会再执行一个循环。它应该是k&lt;r-l+1(应该使用&lt; 而不是&lt;=),就像后面使用的条件i&lt;r+1
  • 条件a[i]&lt;a[j] 是错误的,因为它没有检查部件是否用完。应该是j &gt; r || (i &lt;= m &amp;&amp; a[i]&lt;a[j])
  • if(a[i]&gt;=a[j]) 应该被删除,因为如果你不从一个部分获取元素,你显然会从另一部分获取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2018-10-13
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多