【问题标题】:Getting error in Merge sort. Can somebody help me out finding error?在合并排序中出现错误。有人可以帮我找出错误吗?
【发布时间】:2020-09-27 12:51:57
【问题描述】:

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

#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);
    }
}

【问题讨论】:

  • “它”到底向您展示了什么?请发布完整的输出
  • 它显示mergesort.exe已停止工作,当我使用调试工具时,我发现函数mergesort函数正在无限迭代,
  • 写成if(l + 1 &lt; h),或者更清楚一点,if (h - l &gt; 1)。你不断地对单元素子序列进行无限排序。
  • 您会很高兴听到您不需要任何人的帮助来解决这个问题,只需一个您已经拥有的工具:您的调试器!这正是调试器的用途。它一次一行地运行你的程序,并向你展示正在发生的事情。了解如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。您是否已经尝试过使用调试器?如果不是,为什么不呢?您的调试器向您展示了什么?
  • 感谢@IgorTandetnik 让 if(l+1

标签: c++ algorithm sorting mergesort


【解决方案1】:

算法是正确的,除了mergesort中的测试:if (l &lt; h)应该是if (h - l &gt;= 2)

h 是切片中最后一个元素的索引时,使用测试l &lt; h。在 C 和 C++ 中,将 h 视为排除的上限要简单得多,也更惯用。因此,mergesort 中要拆分的最小切片的长度必须至少为 2:h - l &gt;= 2

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

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

这是修改后的版本:

#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] << " ";
    cout << endl;
    return 0;
}

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(i = 0, k = l; k < j; k++, i++)
        arr[k] = brr[i];
}

void mergesort(int arr[], int l, int h) {
    if (h - l >= 2) {
        int mid = l + (h - l) / 2;
        mergesort(arr, l, mid);
        mergesort(arr, mid, h);
        merge(arr, l, mid, h);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2010-12-25
    • 2021-07-10
    • 2017-11-28
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多