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

C语言归并排序程序中冒泡排序实现错误排查求助

问题排查与修复方案

我帮你找出了代码里的几个核心问题,咱们一步步来修复:

关键错误分析

1. merge_sort的核心逻辑完全偏离需求

你原本的需求是当子数组长度≤10时,用冒泡排序处理该子数组,但当前代码的判断和实现完全错误:

  • 判断条件if(m<=5)毫无依据,应该判断子数组的实际长度j - i + 1 <= 10;
  • 嵌套循环for(i=0;i<=m;i++)完全多余,还篡改了递归参数i和j,导致后续逻辑混乱;
  • 调用bubblesort(arr_sort[i],m)是致命错误:arr_sort[i]是数组中的单个整数,而bubblesort需要的是子数组的起始地址和长度,类型不匹配直接导致程序崩溃或逻辑失效。

2. merge_sort的递归分支逻辑混乱

当前代码中,即使进入了冒泡排序的分支,后续依然会执行merge_sort(m+1,j)和merge_array,这会导致重复处理子数组,逻辑彻底混乱。正确的逻辑应该是:如果子数组长度≤10,处理完就直接返回,不需要再递归拆分和合并。

修复后的完整代码

#include<stdio.h>
#include<stdlib.h>
#define arrsize 10

void merge_sort(int, int);
void merge_array(int, int, int, int);
void bubblesort(int a[], int size);

// 全局排序数组,注意大小和arrsize一致
int arr_sort[arrsize];

int main() { // 标准C中main的返回值应为int
    int i;
    printf("\nEnter %d Elements for Sorting\n", arrsize);
    for (i = 0; i < arrsize; i++)
        scanf("%d", &arr_sort[i]);
    
    printf("\nYour Data :");
    for (i = 0; i < arrsize; i++) {
        printf("\t%d", arr_sort[i]);
    }
    
    merge_sort(0, arrsize - 1);
    
    printf("\n\nSorted Data :");
    for (i = 0; i < arrsize; i++) {
        printf("\t%d", arr_sort[i]);
    }
    
    return 0; // 补充main的返回值
}

// 冒泡排序逻辑本身没问题,这里加个小优化:如果某轮没有交换,提前终止
void bubblesort(int a[], int size) {
    int temp, i, j;
    int swapped; // 标记是否发生交换
    for(i = 0; i < size; i++) {
        swapped = 0;
        // 每轮只需要比较到size-1-i,因为后面的元素已经有序
        for(j = 0; j < size - 1 - i; j++) {
            if(a[j] > a[j+1]) {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
                swapped = 1;
            }
        }
        if(!swapped) break; // 没有交换说明已经有序,提前退出
    }
}

void merge_sort(int i, int j) {
    int m;
    // 核心判断:子数组长度<=10时,直接用冒泡排序
    if (j - i + 1 <= 10) {
        // 传入子数组的起始地址(&arr_sort[i])和长度(j-i+1)
        bubblesort(&arr_sort[i], j - i + 1);
        return; // 处理完成后直接返回,不再递归拆分
    }
    
    // 子数组长度>10,继续递归拆分归并
    if (i < j) {
        m = (i + j) / 2;
        merge_sort(i, m);
        merge_sort(m + 1, j);
        merge_array(i, m, m + 1, j);
    }
}

void merge_array(int a, int b, int c, int d) {
    int t[50];
    int i = a, j = c, k = 0;
    while (i <= b && j <= d) {
        if (arr_sort[i] < arr_sort[j])
            t[k++] = arr_sort[i++];
        else
            t[k++] = arr_sort[j++];
    }
    while (i <= b)
        t[k++] = arr_sort[i++];
    while (j <= d)
        t[k++] = arr_sort[j++];
    for (i = a, j = 0; i <= d; i++, j++)
        arr_sort[i] = t[j];
}

关键修改说明

  1. 修正了merge_sort的判断逻辑:用j - i + 1 <=10判断子数组长度,符合需求;
  2. 修正了bubblesort的调用方式:传入子数组的起始地址&arr_sort[i]和正确长度;
  3. 给merge_sort的冒泡分支添加了return,避免后续重复递归和合并;
  4. 优化了冒泡排序,添加交换标记提前终止,提升效率;
  5. 修正了main函数的返回值,符合标准C语法规范;
  6. 移除了main中未使用的数组a[50],精简代码。

内容的提问来源于stack exchange,提问作者Mikel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:38