Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 合并排序在无限循环中_C++_Algorithm_Sorting_Mergesort - Fatal编程技术网

C++ 合并排序在无限循环中

C++ 合并排序在无限循环中,c++,algorithm,sorting,mergesort,C++,Algorithm,Sorting,Mergesort,我试图编写一个递归合并排序。 然而,当我运行代码时,我发现代码没有通过正确的数组。 请帮我解决这个问题 void merge_sort_recursive(int *arr, int left, int right) { int mid; while (left < right) { mid = (left + right) / 2; merge_sort_recursive(arr, left, mid); merge_s

我试图编写一个递归合并排序。 然而,当我运行代码时,我发现代码没有通过正确的数组。 请帮我解决这个问题

void merge_sort_recursive(int *arr, int left, int right) {
    int mid;
    while (left < right) { 
        mid = (left + right) / 2;
        merge_sort_recursive(arr, left, mid);
        merge_sort_recursive(arr, mid + 1, right);
        merge_recursive(arr, left, mid, right);
    }
    for (int i = 0; i < 4; i++)
        cout << arr[i] << " ";
    cout << endl;
}

void merge_recursive(int *arr, int left, int mid, int right) {
    int *buffer = new int[right + 1]; 
    int lPtr = left; 
    int rPtr = mid + 1;
    int bPtr = left; 

    while (lPtr <= mid && rPtr <= right) {
        if (arr[lPtr] < arr[rPtr]) 
            buffer[bPtr++] = arr[lPtr++];
        else
            buffer[bPtr++] = arr[rPtr++];
    }

    if (lPtr > mid) 
        for (int i = rPtr; i <= right; i++)
            buffer[bPtr++] = arr[i];
    else 
        for (int i = lPtr; i <= mid; i++)
            buffer[bPtr++] = arr[i];

    for (int i = left; i <= right; i++) 
        arr[i] = buffer[i]; 
}
void merge\u sort\u recursive(int*arr,int left,int right){
int mid;
而(左<右){
中间=(左+右)/2;
合并\排序\递归(arr、左、中);
合并\排序\递归(arr,mid+1,右);
合并递归(arr、左、中、右);
}
对于(int i=0;i<4;i++)

cout您的代码中存在多个问题:

  • 在函数
    merge\u sort\u recursive
    中,您不应该在(左<右)
时循环
,而应该在(左<右)
时循环

  • 您应该删除
    merge\u sort\u recursive
    中的输出。我想您在那里只是为了调试
  • 在函数
    merge\u recursive
    中,您分配了一个大小为
    right+1
    的临时数组。这太大了,
    right-left+1
    就足够了(对索引值进行了调整)
  • 您不
    删除
    临时数组,导致大量内存泄漏

  • 第一个合并循环中的测试应该使用
    change
    while(left
    if(left
    ,您的代码将完美运行。请注意,您正在泄漏内存。我看到一个
    new[]
    但没有匹配的
    delete[]
    旁注:调试器在帮助理解无限循环方面非常出色。在调试器中运行程序。等待程序进入无限循环。在循环中单步执行几次,观察程序正在执行的操作。特别注意与退出条件相关的变量。@ReginaKang:您可以接受以下答案之一:y单击其分数下方的灰色复选标记。