C语言归并排序函数中如何按size参数创建缓冲区数组?
归并排序缓冲区的实现方案及代码修正
首先明确:可以根据size参数定义缓冲区数组,C语言里有两种常用实现方式,下面结合你的代码给出具体修正方案,同时解决原代码中的语法和逻辑问题。
原代码存在的问题
- 未定义变量
half、m、n,其中m应为前半部分长度(即half),n应为整个数组长度(即size) - 缓冲区
buffer未定义,这是你核心疑问的点 - 合并阶段的循环语句缺少分号,存在语法错误
- 主函数中误调用
quickSort,应改为调用mergeSort
方案一:使用变长数组(VLA)
C99及以后标准支持变长数组,可直接根据运行时的size参数定义缓冲区大小,语法简单且无需手动管理内存,适合小规模数据场景:
修正后的mergeSort.c代码
#include "mergeSort.h" void mergeSort(int* array, int size){ if (size <= 1) return; int half = size / 2; int m = half; // 前半部分元素数量 int n = size; // 数组总长度 // 递归拆分数组 mergeSort(array, half); mergeSort(array + half, size - half); // 定义变长数组作为缓冲区,大小等于前半部分长度 int buffer[m]; // 将前半部分元素复制到缓冲区 for(int i = 0; i < m; i++) { buffer[i] = array[i]; } int i = 0, j = half, k = 0; // 合并两个有序子数组 while(i < m && j < n) { if (buffer[i] <= array[j]){ array[k++] = buffer[i++]; } else { array[k++] = array[j++]; } } // 复制缓冲区剩余的未合并元素 while(i < m) { array[k++] = buffer[i++]; } }
配套的mergeSort.h头文件
#ifndef MERGESORT_H #define MERGESORT_H void mergeSort(int* array, int size); #endif
修正后的主函数代码
#include <stdio.h> #include "./mergeSort.h" #define SIZE 5 int main(){ int array[SIZE] = {5, 3, 2, 4, 1}; // 调用归并排序 mergeSort(array, SIZE); // 打印排序结果 for (int i = 0; i < SIZE; i++){ printf("%d\n", array[i]); } return 0; }
方案二:使用动态内存分配
如果需要处理大规模数据,或编译器不支持C99变长数组,推荐用malloc动态分配缓冲区,使用后必须用free释放内存,避免泄漏:
修正后的mergeSort.c代码
#include "mergeSort.h" #include <stdlib.h> // 引入malloc/free的头文件 void mergeSort(int* array, int size){ if (size <= 1) return; int half = size / 2; int m = half; int n = size; mergeSort(array, half); mergeSort(array + half, size - half); // 动态分配缓冲区内存 int* buffer = (int*)malloc(m * sizeof(int)); if (buffer == NULL) { // 内存分配失败时直接返回,避免程序崩溃 return; } // 复制前半部分元素到缓冲区 for(int i = 0; i < m; i++) { buffer[i] = array[i]; } int i = 0, j = half, k = 0; while(i < m && j < n) { if (buffer[i] <= array[j]){ array[k++] = buffer[i++]; } else { array[k++] = array[j++]; } } while(i < m) { array[k++] = buffer[i++]; } // 释放动态分配的内存 free(buffer); }
关键说明
- 变长数组基于栈空间分配,语法简单但栈容量有限,不适合处理超大数组(易触发栈溢出)
- 动态内存分配基于堆空间,适合大规模数据,但必须严格配对
malloc和free,否则会造成内存泄漏
内容的提问来源于stack exchange,提问作者Abd-Alghany Osama
相关产品推荐
相关产品推荐

