【发布时间】: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 < h),或者更清楚一点,if (h - l > 1)。你不断地对单元素子序列进行无限排序。 -
您会很高兴听到您不需要任何人的帮助来解决这个问题,只需一个您已经拥有的工具:您的调试器!这正是调试器的用途。它一次一行地运行你的程序,并向你展示正在发生的事情。了解如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。您是否已经尝试过使用调试器?如果不是,为什么不呢?您的调试器向您展示了什么?
-
感谢@IgorTandetnik 让 if(l+1
标签: c++ algorithm sorting mergesort