C语言归并排序调试无法进入msort函数、程序直接终止问题排查
归并排序代码问题排查
你的代码存在4处明显问题,其中数组越界访问是导致调用msort直接崩溃的核心原因,具体问题和修正方案如下:
- 问题1:merge函数左半段遍历指针初始化错误
merge函数第一行定义的int i=0错误,左半段的起始下标是传入的low参数,应该修改为int i = low。 - 问题2:临时数组拷贝回原数组时下标越界
临时数组brr是从下标0开始存储有序元素的,你直接使用arr[k]=brr[k]会访问到brr的非法下标,应该修改为arr[k] = brr[k - low]。 - 问题3:剩余元素拷贝判断逻辑错误
你写的if(j<high)判断条件不对,应该改为判断左半段是否遍历完毕:if(i > mid),否则会遗漏右半段最后一个元素的拷贝。 - 问题4:非标准写法冗余
你引入了未使用的<conio.h>头文件,void main()不符合C语言标准,建议改为int main()并在函数末尾返回0。
修正后可运行代码
#include<stdio.h> void merge(int arr[],int low,int mid,int high){ int i=low,j=mid+1,brr[high-low+1],k=0; while(i<=mid&&j<=high){ if(arr[i]<=arr[j]) brr[k++]=arr[i++]; else brr[k++]=arr[j++]; } // 拷贝剩余元素 if(i>mid) while(j<=high) brr[k++]=arr[j++]; else while(i<=mid) brr[k++]=arr[i++]; // 拷贝回原数组,brr下标从0开始 for(k=low;k<=high;k++){ arr[k]=brr[k - low]; } } void msort(int arr[],int low,int high){ if(low<high){ // mid计算放在判断内,避免low>=high时无意义计算 int mid=(low+high)/2; msort(arr,low,mid); msort(arr,mid+1,high); merge(arr,low,mid,high); } } int main(){ int arr[]={23,54,-1,76,1,90,34,56}; int len=8; printf("before sorting: "); for(int i=0;i<len;i++) printf("%d,",arr[i]); printf("\nafter sorting: "); msort(arr,0,len-1); for(int i=0;i<len;i++) printf("%d ",arr[i]); return 0; }
内容的提问来源于stack exchange,提问作者Harsha Vardhan
相关产品推荐
相关产品推荐

