You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:45:04