C++归并排序实现无报错但运行异常,请求问题排查
解决你的归并排序程序无响应问题
我帮你排查了代码里的几个关键问题,这些正是导致程序卡死无响应的核心原因:
mergeSort函数缺少递归终止条件:当前的mergeSort会无限递归调用自己,直到栈溢出,这直接导致程序失去响应。必须添加判断,当
beg >= end时停止递归——因为此时子数组只有一个元素,本身就是有序的,无需再拆分。数组大小计算错误:
sizeof(arr)返回的是整个数组的字节数(你的代码里是400,因为int占4字节,100个元素),而非元素个数。正确的计算方式应该是sizeof(arr)/sizeof(arr[0]),这样才能得到数组实际的元素数量。merge函数中元素回写逻辑错误:你当前的循环
for(int k = beg; k < index; k++) arr[k] = temp[k];会把temp里的元素错误写入arr的beg到index位置,但temp里的元素是从0开始存储的,正确的对应关系应该是temp[0]对应arr[beg]、temp[1]对应arr[beg+1],直到覆盖arr[end]。
下面是修正后的完整代码:
#include<iostream> using namespace std; void merge(int arr[], int beg, int mid, int end) //function to merge the arrays { int i = beg; int j = mid + 1; int index = 0; int temp[100]; while(i <= mid && j <= end) { if(arr[i] < arr[j]) { temp[index] = arr[i]; i++; } else { temp[index] = arr[j]; j++; } index++; } while(i <= mid) { temp[index] = arr[i]; i++; index++; } while(j <= end) { temp[index] = arr[j]; j++; index++; } // 修正:将temp中的元素正确回写到arr的对应位置 for(int k = 0; k < index; k++) arr[beg + k] = temp[k]; } void mergeSort(int arr[], int beg, int end) //dividing the array { // 新增:递归终止条件,子数组只有一个元素时停止 if(beg >= end) return; int mid = (beg + end)/2; mergeSort(arr, beg, mid); mergeSort(arr, mid+1, end); merge(arr, beg, mid, end); } int main(void) { int arr[100]; int size; // 优化:让用户先输入实际元素个数,避免处理未初始化的随机值 cout<<"Enter the number of elements (max 100): "<<endl; cin>>size; if(size > 100) size = 100; // 限制最大输入数量 cout<<"Enter the array elements: "<<endl; for(int i = 0; i < size; i++) cin>>arr[i]; mergeSort(arr, 0, size-1); cout<<"Sorted array: "<<endl; for(int i = 0; i < size; i++) cout<<arr[i]<<" "; cout<<endl; }
内容的提问来源于stack exchange,提问作者jsandy
相关产品推荐
相关产品推荐

