归并排序算法代码无法编译运行,请求错误排查与修复
C语言归并排序代码编译错误排查与修复
编译错误原因及修复点
- merge函数数组赋值变量误用
在merge函数的第二个for循环中,错误使用了变量i给a2数组赋值,正确应使用循环变量j:
原错误代码片段:
for(j=0;j<n2;j++) { a2[i]=arr[mid+1+j]; }
修复后:
for(j=0;j<n2;j++) { a2[j]=arr[mid+1+j]; }
- 函数声明缺失
main函数中调用了mergesort和merge,但这两个函数的定义在main之后,C编译器会默认认为函数返回int类型,与实际的void返回类型冲突,导致编译错误。需在main函数前添加函数声明:
void merge(int arr[],int left,int mid,int right); void mergesort(int arr[],int left,int right);
- main函数返回类型不符合标准
标准C语言中,main函数的返回类型必须是int,void main()属于非标准写法,部分编译器会报错。需修改为:
int main() { // 原有代码逻辑 return 0; }
修复后的完整代码
#include<stdio.h> #include<stdlib.h> // 提前声明函数 void merge(int arr[],int left,int mid,int right); void mergesort(int arr[],int left,int right); void merge(int arr[],int left,int mid,int right) { int i,j,k; int n1,n2; n1=mid-left+1; n2=right-mid; int a1[n1],a2[n2]; for(i=0;i<n1;i++) { a1[i]=arr[left+i]; } for(j=0;j<n2;j++) { a2[j]=arr[mid+1+j]; // 修复变量误用问题 } i=0; j=0; k=left; while(i<n1 && j<n2) { if(a1[i]<=a2[j]) { arr[k]=a1[i]; i++; } else { arr[k]=a2[j]; j++; } k++; } while(i<n1) { arr[k]=a1[i]; i++; k++; } while(j<n2) { arr[k]=a2[j]; j++; k++; } } void mergesort(int arr[],int left,int right) { if(left<right) { int mid=left+(right-left)/2; mergesort(arr,left,mid); mergesort(arr,mid+1,right); merge(arr,left,mid,right); } } int main() // 修复main函数返回类型 { int n,i; printf("Enter the number of elements in the array:"); scanf("%d",&n); int arr[n]; for(i=0;i<n;i++) { printf("Enter the Element %d:",i+1); scanf("%d",&arr[i]); } mergesort(arr,0,n-1); printf("The Elements in the array sorted are:"); for(i=0;i<n;i++) { printf("%d->",arr[i]); } return 0; // 添加标准返回语句 }
内容的提问来源于stack exchange,提问作者H_V123
相关产品推荐
相关产品推荐

