【问题标题】:Merge Sort not merging properly C++合并排序未正确合并 C++
【发布时间】:2023-03-28 03:55:02
【问题描述】:

我已经编写了一个合并排序程序,该程序工作正常,直到合并时它没有正确合并

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

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

【问题讨论】:

    标签: c++ sorting merge


    【解决方案1】:

    在操作数组时,您应该特别注意边界。

    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 检查变量的值,以防代码无法按您的意愿执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多