C++ 在合并排序中获取错误。有人能帮我找出错误吗?

C++ 在合并排序中获取错误。有人能帮我找出错误吗?,c++,algorithm,sorting,mergesort,C++,Algorithm,Sorting,Mergesort,我试图以更简单的方式进行合并排序,但并没有得到所需的输出。它向我展示了一些循环是无限迭代的。有人能帮我找出代码中的错误在哪里吗 #include <bits/stdc++.h> void merge(int arr[], int, int, int); void mergesort(int arr[], int, int); using namespace std; int main() { int n, m; cin >> n; int a

我试图以更简单的方式进行合并排序,但并没有得到所需的输出。它向我展示了一些循环是无限迭代的。有人能帮我找出代码中的错误在哪里吗

#include <bits/stdc++.h>

void merge(int arr[], int, int, int);
void mergesort(int arr[], int, int);

using namespace std;

int main() {
    int n, m;
    cin >> n;
    int arr[n]; 
    for (int i = 0; i < n; i++)
        cin >> arr[i];
    mergesort(arr, 0, n);
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
}

void merge(int arr[], int l, int mid, int h) {
    int i = l, j = mid, k = 0;
    int brr[h - l];

    while (i < mid && j < h) {
        if (arr[i] <= arr[j])
            brr[k++] = arr[i++];
        else
            brr[k++] = arr[j++];
    }
    for(; i < mid; i++)
        brr[k++] = arr[i];
    for(; j < h; j++)
        brr[k++] = arr[j];
    
    int i = 0;
    for(k = l; k < h; k++)
        arr[k] = brr[i++];
}

void mergesort(int arr[], int l, int h) {
    if (l < h) {
        int mid = l + (h - l) / 2;
        mergesort(arr, l, mid);
        mergesort(arr, mid, h);
        merge(arr, l, mid, h);
    }
}
#包括
无效合并(int arr[],int,int,int);
无效合并排序(int arr[],int,int);
使用名称空间std;
int main(){
int n,m;
cin>>n;
int-arr[n];
对于(int i=0;i>arr[i];
合并排序(arr,0,n);
对于(int i=0;icout除了在
mergesort
中的测试外,该算法是正确的:
if(l
应该是
if(h-l>=2)

> <代码> L< H/COD>在代码“>代码< h >代码>是该条中最后一个元素的索引。C和C++中,考虑<代码> h <代码>是一个被排斥的上界,它更简单、更惯用,因此在 GysErrt 中的最小切片要有至少2的长度:<代码> H-L>=2 < /C> >

注意,将数组分配为VLAs对于大型数组是有风险的:它可能导致<强>堆栈溢出< /强>。C++不支持VLAs(可变长度数组,即大小不是编译时表达式的自动数组),编译器将其作为扩展支持。

还请注意,
merge
中最后一个
for
循环可以省略,因为它复制的元素已经在正确的位置

以下是修改后的版本:

#包括
无效合并(int arr[],int,int,int);
无效合并排序(int arr[],int,int);
使用名称空间std;
int main(){
int n,m;
cin>>n;
int-arr[n];
对于(int i=0;i>arr[i];
合并排序(arr,0,n);
对于(int i=0;i“它”到底向您显示了什么?请发布完整的输出,它显示mergesort.exe已停止工作,当我使用调试工具时,我发现函数mergesort正在无限迭代,请将其设置为
if(l+1
或者更清楚地设置为
if(h-l>1)
。你一直在无限地对一个元素子序列进行排序。你会很高兴听到你不需要任何人的帮助来解决这个问题,只需要一个你已经拥有的工具:你的调试器!这正是调试器的用途。它运行你的程序,一次一行,并向你展示正在发生的事情。了解如何使用调试器是ev所需要的技能在C++中,没有任何例外。在调试程序的帮助下,您应该能够快速找到您编写的所有和将来的程序中的所有bug,而不必请求任何人的帮助。您是否已经尝试使用调试器?如果没有,为什么不呢?调试器显示了什么?谢谢IgorTandetnik制造IF(L+1)1。