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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:23:09