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

Binary Insertion sort程序异常问题排查与修改请求:返回超大值且生成空Excel文件

二分插入排序程序错误排查与修复

我帮你仔细检查了这段代码,找到了几个导致程序返回超大值、且stat8.csv为空的关键问题,下面逐个梳理并给出修复方案:

主要错误点分析

1. 数组赋值的循环变量误用

在生成随机数组的循环中,你写了*(a+i)=rand()%50;,但此时循环变量是k,而i是外层未初始化的变量(值为随机垃圾值)。这会导致你往数组的随机位置甚至越界内存写入数据,直接破坏其他变量的内存空间,这是出现超大值的核心原因。

2. 随机种子初始化位置错误

你把srand(time(NULL));放在了每次生成数组的循环内部,由于循环执行速度极快,time(NULL)返回的秒数在多次循环中完全相同,导致每次生成的随机数组完全重复,而且频繁重置种子也不符合随机数生成的规范。

3. 二分查找函数传参错误

调用binarySearch时,你传入的是comps的值,但函数需要的是指针来修改主函数中的comps变量。传值会导致函数内部仅修改副本,主函数的比较次数根本不会更新,还可能引发栈上数值混乱的异常。

4. 循环变量名冲突

你在main开头声明了int i,s;,后续排序循环又复用了i作为循环变量,结合前面的变量误用问题,极易导致变量值混乱,引发内存操作错误。

修复后的完整代码

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

int binarySearch(int* arr, int elem, int start, int end, int* comps) {
    (*comps)++;
    if (end <= start) {
        (*comps)++;
        return (elem > arr[start]) ? (start + 1) : start;
    }
    int mid = (start + end) / 2;
    (*comps)++;
    if (elem == arr[mid]) return mid + 1;
    (*comps)++;
    if (elem > arr[mid]) return binarySearch(arr, elem, mid + 1, end, comps);
    return binarySearch(arr, elem, start, mid - 1, comps);
}

int main(int argc, char *argv[]) {
    FILE *f = fopen("stat8.csv", "w");
    if (!f) { // 新增文件打开失败判断
        printf("无法打开文件\n");
        return 1;
    }

    srand(time(NULL)); // 移到开头,仅初始化一次随机种子
    int n = 100;
    int s;

    while (n <= 10000) {
        int total = 0;
        for (s = 0; s < 5; s++) {
            int *a = (int *)malloc(n * sizeof(int));
            if (!a) { // 新增内存分配失败判断
                printf("内存分配失败\n");
                fclose(f);
                return 1;
            }

            // 修复循环变量,使用k赋值数组元素
            for (int k = 0; k < n; k++) {
                a[k] = rand() % 50;
            }

            int comps = 0;
            int swaps = 0;
            // 更换排序循环变量名,避免冲突
            for (int current = 1; current < n; current++) {
                int j = current - 1;
                int selected = a[current];
                // 传comps的指针给二分查找函数
                int loc = binarySearch(a, selected, 0, j, &comps);
                while (j >= loc) {
                    comps++;
                    swaps++;
                    a[j + 1] = a[j];
                    j--;
                }
                a[j + 1] = selected;
                // 移除多余的comps++,避免重复统计
            }

            total += swaps + comps;
            free(a); // 新增内存释放,避免内存泄漏
        }
        int avg = total / 5;
        fprintf(f, "%d ; %d\n", n, avg);

        if (n < 1000) {
            n += 100;
        } else {
            n += 1000;
        }
    }
    fclose(f);
    return 0;
}

额外优化点说明

除了修复核心错误,我还添加了:

  • 文件打开失败的判断,避免后续操作崩溃
  • 内存分配失败的判断,增强程序健壮性
  • 循环结束后释放数组内存,避免内存泄漏
  • 移除了排序循环末尾多余的comps++,避免重复统计比较次数

修改后,程序会正常生成stat8.csv文件,其中记录了不同元素数量下,交换次数与比较次数总和的平均值,不会再出现超大值的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:39:07