我已经为合并排序编写了一个程序,该程序运行良好,直到合并它没有正确合并为止
以下是执行合并排序的3个函数。我找不到问题
void mergeSort(int A[], int tmp[], int n)
{
mergeSort(A, tmp, 0, n);
merge(A,tmp,0,n);}
void mergeSort(int A[],int tmp[], int left, int right){
if (right-left<2)
return;
int mid;
if (left < right)
{
mid= ((left+right)/2);
mergeSort(A, tmp, mid+1, right);
merge (A, tmp, mid+1, right-1);
mergeSort(A, tmp, left ,mid);
merge (A, tmp, left, mid);
}
return;
}
void merge(int A[], int tmp[], int left, int right)
{
int k=left;
int start=left;
int mid= ((right+left)/2)+1;
int leftEnd= mid-1;
int numElemet= (right-left);
while ((left<=leftEnd) &&(mid<=right))
{
if (A[left]<= A[mid])
{
tmp[k] = A[left];
k++;
left++;
}
else
{
tmp[k] = A[mid];
k++;
mid++;
}
}
while (left<= leftEnd)
{
tmp[k]= A[left];
left++;
k++;
}
while(mid<= right)
{
tmp[k]= A[mid];
mid++;
k++;
}
for (int i=start;i<k; i++)
{
A[i]= tmp[i];
}
}
因此,程序进入数组会很好地分割它但是当它返回时,递归错过了一些合并,并且一半的数组没有在正确的位置合并。 我该如何解决?
答案 0 :(得分:0)
在操作数组时,你应该仔细考虑边界。
1。 你的代码:
mergeSort(A, tmp, mid+1, right);
merge (A, tmp, mid+1, right-1);
合并排序是一种Divide and conquer
方法。被划分和征服的数字范围应该相同。您认为上述代码的哪一部分有错误?
2. int numElemet= (right-left);
未使用且应删除,此外,元素数应为right-left+1
。
3
for (int i=start;i<k; i++)
{
A[i]= tmp[i];
}
k不是所需的值,请尝试在此代码之前找到错误的位置。
4。
一个忠告:
使用选项卡缩进代码以提高可读性。这对你和阅读代码的人都有好处。如果代码没有按照您的意愿执行,请使用cout
检查变量的值。