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]; }
关键修改说明
- 修正了
merge_sort的判断逻辑:用j - i + 1 <=10判断子数组长度,符合需求; - 修正了
bubblesort的调用方式:传入子数组的起始地址&arr_sort[i]和正确长度; - 给
merge_sort的冒泡分支添加了return,避免后续重复递归和合并; - 优化了冒泡排序,添加交换标记提前终止,提升效率;
- 修正了
main函数的返回值,符合标准C语法规范; - 移除了
main中未使用的数组a[50],精简代码。
内容的提问来源于stack exchange,提问作者Mikel
相关产品推荐
相关产品推荐

