递归Mergesort的实现

时间:2014-07-18 09:38:42

标签: c algorithm sorting mergesort

我做了一个递归合并排序代码,但它不起作用,任何人都可以告诉我在代码中我哪里出错了。

void mergesort(int A[],int start,int end)
{
    int B[(end-start)/2],C[(end-start)/2],i,j,k,flag=0;
    if(start==end)
      return;
    else
    {
      mergesort(A,start,(start+end)/2);
      mergesort(A,(start+end)/2+1,end);
    }
    for(i=start;i<(start+end)/2;i++)
      B[i]=A[i];
    for(i=(start+end)/2+1;i<end;i++)
      C[i]=A[i];
    for(i=start,j=start,k=(start+end)/2+1;i<end;i++)
    {
        if(j==(start+end)/2)
        {
            while(k!=end)
              A[i]=C[k++];
            flag=1;
        }
        if(k==end)
        {
            while(j!=(start+end)/2)
              A[i]=B[j++];
            flag=1;
        }
        if(flag)
          break;
        if(A[j]&gt;C[k])
          A[i]=C[k++];
        else
          A[i]=B[j++];
    }
    return;
}

在代码的第一部分我试图将数组划分为2个子数组,如果我只剩下一个元素,我开始合并并到达顶部以获得排序数组。

2 个答案:

答案 0 :(得分:0)

递归调用的一个终点是错误的。您需要确定子数组中是否包含end或数组末尾是否包含end。代码似乎想要排除end,但是您的递归调用如下所示:

mergesort(A,start,(start+end)/2); // should be (start+end)/2+1 if end is excluded
mergesort(A,(start+end)/2+1,end);

答案 1 :(得分:0)

一个杀手级问题是循环

for(i=(start+end)/2+1;i<end;i++)
  C[i]=A[i];

立即写入数组之外。所有投注都已关闭,但无论如何C并未包含您的预期。