为什么实现mergesort的代码没有产生正确的结果?

时间:2013-11-15 12:44:31

标签: c

这里我试图在10个元素的数组上实现mergesort。在提供输入a [10] = {9,8,7,6,5,4,3,2,1,0}时,我得到输出为{0,0,1,1,0,4,4 ,4,3,2},而预期产出为{0,1,2,3,4,5,6,7,8,9}。我在main中调用mergesort,其中l = 0,h = 9。

void mergesort(int a[],int l,int h)
    {   
      int c[10];
      int m=(l+h)/2;
      if(l<h)
      { 
            mergesort(a,l,m);           // Recursive call to sort first half
            mergesort(a,m+1,h);         // Recursive call to sort second half
        }
        int i,k=l,j=l;
        while(k<=h)                        // Merging the first and second half of the array
        {   
            if(a[j]<a[m+1])
            {
                c[k]=a[j];
                k++;
                j++;
            }
            else
            {
                c[k]=a[m+1];
                k++;
                m++;
            }       
        }
        for(i=l;i<=h;i++)
            a[i]=c[i];  
    }

2 个答案:

答案 0 :(得分:1)

少数几个问题之一:由于您正在递增它,因此l的值不再是while循环后的有效左限制。因此,当您在for循环中从数组c复制到a时,您正在复制无效数据。

答案 1 :(得分:1)

问题在于,在你的while循环中,你有时会看到你应该超出界限。

假设你在函数的开头加上一个检查,说l == h然后返回(因为排序一个元素数组是不必要的),那么它第一次做任何事情就是当它递归到{{1}时}。这里我们基本上合并了两个单元素数组。

我们第一次进行循环时mergesort(a, 0,1)。我们将进入if的else部分,因为元素0大于1.因此我们在输出数组中写出[1],现在我们有i,j,k,m=0i,j=0。我们现在应该做的是注意我们的第二个数组已用完并从第一个数组中的其余元素填充。

我们所做的是比较元素k,m=1j(即0和2)。这显然是错误的,因为元素2不应出现在数组中。我们当然发现元素2较小,因此将其放入位置2的输出数组中。一旦我们复制了这个,我们就会得到m+1,这就是出错的地方。