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
相关产品推荐
相关产品推荐

