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

一维动态数组正元素MergeSort排序失效问题排查

一维动态数组正元素归并排序失败问题分析

核心问题及修复

1. 排序函数索引参数错误

调用归并排序时传入的last参数不符合数组索引规则:

MergeSort(arrp, 0, n); 

数组arrp的元素个数是n,索引范围为0到n-1,传入n会导致Merge函数访问超出数组边界的内存,触发未定义行为,直接打乱排序逻辑。
修复:将参数改为数组最后一个元素的索引n-1

MergeSort(arrp, 0, n-1); 

2. 打印对象错误

排序完成后打印的是原数组arr,而非排序后的目标数组arrp:

printf("\nSorted array: ");
for (i = 0; i < n; i++)
    printf("%d ", arr[i]);

这会导致你看到的始终是未排序的原数据,误以为排序未执行。
修复:改为打印排序后的arrp

printf("\nSorted array: ");
for (i = 0; i < n; i++)
    printf("%d ", arrp[i]);

3. Merge函数临时数组内存分配不足

Merge中临时数组mas的内存计算少了1个元素:

mas = (int *)malloc((last - first) * sizeof(int));

当first到last包含last-first+1个元素时,只分配last-first大小的内存会导致越界写入,破坏内存结构,让排序中途失效。
修复:调整分配大小为last - first + 1,同时添加内存释放避免泄漏

mas = (int *)malloc((last - first + 1) * sizeof(int));
// ... 原有复制逻辑 ...
free(mas); // 在Merge函数末尾添加

4. 未定义的check()函数

main函数中调用了未实现的check()函数,直接导致编译失败。可以用已有的input()函数替代,因为input()已经包含输入校验逻辑:

printf("Input num of elements in mass: ");
n = input(); // 替换n = check();

修正后的完整代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int input() {
    int var;
    while ((scanf_s("%d", &var) == 0) || getchar() != '\n') {
        printf("wrong input! try again\n");
        rewind(stdin);
    }
    return var;
}

void Merge(int *A, int first, int last) {
    int middle, start, final, j;
    int *mas;
    middle = (first + last) / 2; 
    start = first; 
    final = middle + 1; 
    // 修正内存分配大小
    mas = (int *)malloc((last - first + 1) * sizeof(int));
    for (j = first; j <= last; j++) 
        if ((start <= middle) && ((final > last) || (A[start] < A[final]))) {
            *(mas + j - first) = A[start];
            start++;
        } else {
            *(mas + j - first) = A[final];
            final++;
        }
    
    for (j = first; j <= last; j++)
        A[j] = *(mas + j - first);
    // 释放临时内存
    free(mas);
}

void MergeSort(int *A, int first, int last) {
    if (first < last) {
        MergeSort(A, first, (first + last) / 2); 
        MergeSort(A, (first + last) / 2 + 1, last); 
        Merge(A, first, last);
    }
}

int main() {
    int i, n, j;
    int *arr;
    int *arrp;
    printf("Input num of elements in mass: ");
    // 替换未定义的check()为input()
    n = input();
    arr = (int *)malloc(n * sizeof(int));
    for (i = 0; i < n; i++) {
        printf("Element %d = ", i + 1); 
        arr[i] = input();
    }
    for (i = 0; i < n; i++) {
        printf("%d  ", arr[i]);
    }
    printf("\n");

    for (i = 0; i < n; i++) {
        if (arr[i] < 0) {
            for (j = i; j < n - 1; j++) {
                arr[j] = arr[j + 1];
            }
            i--;
            n--;
        }
    }
    arrp = (int *)malloc(n * sizeof(int));
    for (i = 0; i < n; i++) {
        arrp[i] = arr[i];
        printf("%d  ", arrp[i]);
    }
    printf("\n");
    // 修正排序函数的last参数为n-1
    MergeSort(arrp, 0, n-1); 
    printf("\nSorted array: ");
    // 修正打印对象为排序后的arrp
    for (i = 0; i < n; i++)
        printf("%d ", arrp[i]);
    free(arrp);
    free(arr);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:31:03