C++ 合并排序算法。合并功能不起作用

C++ 合并排序算法。合并功能不起作用,c++,algorithm,sorting,merge,mergesort,C++,Algorithm,Sorting,Merge,Mergesort,我试图做一个合并排序算法,我遇到了一个块与合并功能。我已经尝试了几种不同的方法来解决这个问题,并学习了一些YouTube教程,但仍然不起作用 有人能帮我找出这有什么问题吗 合并排序 void合并排序(int-arrayToSort[],int-startIndex,int-lengthToSort){ int midIndex=0; if(startIndex0)(填充=1); int*temp=新的int[size]; int left=大小/2; int right=(大小/2)+填充; i

我试图做一个合并排序算法,我遇到了一个块与合并功能。我已经尝试了几种不同的方法来解决这个问题,并学习了一些YouTube教程,但仍然不起作用

有人能帮我找出这有什么问题吗

合并排序
void合并排序(int-arrayToSort[],int-startIndex,int-lengthToSort){
int midIndex=0;
if(startIndex
合并
void合并(int-arraysortedintwowhalves[],int-startIndex,int-length){
整数大小=(长度-起始索引)+1;
int padding=0;
如果(大小%2>0)(填充=1);
int*temp=新的int[size];
int left=大小/2;
int right=(大小/2)+填充;
int i=0;
int j=(大小/2)+填充;
int k=0;
而((i如果(arraysortedintwowhalf[i]看起来您的bug就在这里

    }
    k++;
    while (i < left) {
        temp[k] = arraySortedInTwoHalves[i];
        k++;
    }
    while (j < length) {
        temp[k] = arraySortedInTwoHalves[j];
        j++;
    }
}

点>代码> ArayToSoRt+LoththtoRoTr> <代码>是一个结束。这表明您正在使用标准的C++习语<代码> [开始,结束] < /C> > /P> 下一个电话似乎遵循了这个惯例

        mergeSort(arrayToSort, startIndex, midIndex);
但是这个调用似乎表明长度是包含的。因为您将
midIndex
从范围中排除(这意味着它应该在上面的调用中)。但是这意味着
lengthToSort
也应该在下面的范围中,但这不是原始调用的含义

        mergeSort(arrayToSort, (midIndex + 1), lengthToSort);
您的范围正确吗?为了帮助使其显式化,许多实现通过使用接口使其显式化

        mergeSort(begin, mid);  // begin, mid and end are iterators.
        mergeSort(mid, end);
        merge(begin, mid, end);

看来你的虫子来了

    }
    k++;
    while (i < left) {
        temp[k] = arraySortedInTwoHalves[i];
        k++;
    }
    while (j < length) {
        temp[k] = arraySortedInTwoHalves[j];
        j++;
    }
}

点>代码> ArayToSoRt+LoththtoRoTr> <代码>是一个结束。这表明您正在使用标准的C++习语<代码> [开始,结束] < /C> > /P> 下一个电话似乎遵循了这个惯例

        mergeSort(arrayToSort, startIndex, midIndex);
但是这个调用似乎表明长度是包含的。因为您将
midIndex
从范围中排除(这意味着它应该在上面的调用中)。但是这意味着
lengthToSort
也应该在下面的范围中,但这不是原始调用的含义

        mergeSort(arrayToSort, (midIndex + 1), lengthToSort);
您的范围正确吗?为了帮助使其显式化,许多实现通过使用接口使其显式化

        mergeSort(begin, mid);  // begin, mid and end are iterators.
        mergeSort(mid, end);
        merge(begin, mid, end);

帮助读者:合并函数通常采用两个数组作为输入,它们的大小不一定相同,因此不清楚单个数组和单个长度采用
merge()+1
,所以
length
并不是我所想的意思。对不起,我应该更清楚地说明这一点。我有一个实验室,作为实验室的一部分,我有两个函数签名;我必须在不更改签名的情况下实现功能。我见过传递两个数组的方法以及低、中、高传递的方法,但我不能使用这一点。长度变量有点令人困惑,我同意,但我得到了它,我不能修改它。帮助读者:一个合并函数通常需要两个数组作为输入,它们的大小不一定相同,因此不清楚单数组和单长度取用
merge()
函数应该可以工作。在这个函数中,您要做的第一件事就是计算
size=(length-startIndex)+1
,所以
length
并不是我所想的意思。对不起,我应该更清楚地说明这一点。我有一个实验室,作为实验室的一部分,我有两个函数签名;我必须在不更改签名的情况下实现功能。我见过传递两个数组的方法以及低、中、高传递的方法,但我不能使用这一点。长度变量有点令人困惑,我同意,但我得到了它,我无法修改它。我不知道我的范围是否正确。我怀疑这就是我遇到的问题。我不知道如何正确填充临时数组。我见过一种方法,将低、中、高传递到函数中,但我无法更改签名是因为它是实验室的一部分。我将原始长度主要传递为-1,因此它应该正确地拆分数组。@G3ORGE:这些可能会有帮助:谢谢你的建议。我将查看这些链接。@G3ORGE:如果这个答案帮助你解决了问题,你应该给它一个向上投票并将其标记为已接受的ans答:我不知道我的范围是否正确。我怀疑这就是我遇到的问题。我不知道如何正确填充临时数组。我见过一种方法,其中低、中、高三个值都被传递到函数中,但是我不能更改签名,因为这是实验的一部分。我在主函数中传递原始长度为-1,所以它是应该正确拆分数组。@G3ORGE:这些可能会有帮助:谢谢你的建议。我将查看这些链接。@G3ORGE:如果这个答案帮助你解决了这个问题,你应该投赞成票,并将其标记为已接受的答案。
        mergeSort(arrayToSort, (midIndex + 1), lengthToSort);
        mergeSort(begin, mid);  // begin, mid and end are iterators.
        mergeSort(mid, end);
        merge(begin, mid, end);