我做了一个递归合并排序代码,但它不起作用,任何人都可以告诉我在代码中我哪里出错了。
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]>C[k])
A[i]=C[k++];
else
A[i]=B[j++];
}
return;
}
在代码的第一部分我试图将数组划分为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
并未包含您的预期。