【发布时间】:2020-07-16 08:40:33
【问题描述】:
我正在尝试编写递归合并排序。 但是,当我运行代码时,我发现代码没有通过正确的数组。 请帮我解决问题。
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];
}
【问题讨论】:
-
将
while (left < right)更改为if (left < right),您的代码将完美运行。 -
请注意,您正在泄漏内存。我看到
new[]但没有匹配的delete[] -
旁注:调试器非常擅长帮助理解无限循环。在调试器中运行程序。等待程序进入无限循环。循环几次,观察程序在做什么。特别注意与退出条件相关的变量。
-
@ReginaKang:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。
标签: c++ algorithm sorting mergesort