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
就足够了(对索引值进行了调整)
您不删除
临时数组,导致大量内存泄漏
第一个合并循环中的测试应该使用changewhile(left
到if(left
,您的代码将完美运行。请注意,您正在泄漏内存。我看到一个new[]
但没有匹配的delete[]
旁注:调试器在帮助理解无限循环方面非常出色。在调试器中运行程序。等待程序进入无限循环。在循环中单步执行几次,观察程序正在执行的操作。特别注意与退出条件相关的变量。@ReginaKang:您可以接受以下答案之一:y单击其分数下方的灰色复选标记。