合并排序没有正确合并C ++

时间:2014-02-11 05:36:11

标签: c++ sorting merge

我已经为合并排序编写了一个程序,该程序运行良好,直到合并它没有正确合并为止

以下是执行合并排序的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];
}
}

因此,程序进入数组会很好地分割它但是当它返回时,递归错过了一些合并,并且一半的数组没有在正确的位置合并。 我该如何解决?

1 个答案:

答案 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检查变量的值。