C语言带冒泡排序的二分查找程序运行异常问题咨询
问题排查与修复方案
核心错误点
- 类型错误导致死循环:
low和high使用无符号类型size_t,当搜索值小于数组最小元素时,high = middle -1会触发无符号整数下溢,high会变成极大的正整数,导致循环判断条件low <= high永远成立,程序卡死。 - 返回值逻辑错误:无匹配场景下返回了最后一次计算的
middle值,而非约定的标记无匹配的-1,当搜索值大于数组最大元素时,最后一次的middle刚好是数组最后一位索引,就会出现误报匹配成功的问题。 - 返回值未接收:定义了全局变量
value用来接收查找结果,但调用binary_search后没有将返回值赋值给value,判断逻辑完全基于value的初始值0,进一步加剧了结果错误。 - 类型不兼容:
binary_search返回值是size_t无符号类型,就算返回-1也会被转换成极大的正整数,永远不可能等于int类型的-1,无匹配判断逻辑永远不生效。
修复方案
1. 修改二分查找函数定义
把参数和返回值都改成int类型,无匹配时直接返回-1:
int binary_search(const int b[], int search, int low, int high) { int middle=0; while (low<=high) { middle = (high+low)/2; if (b[middle]==search) return middle; else if (search>b[middle]) { low = middle+1; } else { high = middle-1; } } return -1; }
2. 修正main函数中的返回值接收逻辑
修改调用逻辑,主动接收查找返回值:
// 调用处改为接收返回值 int value = binary_search( a, key, 0, size-1);
3. 可选优化:修正冒泡排序边界
原冒泡排序的循环条件pass<i-1中i依赖之前打印数组后的取值,建议直接明确为数组长度,避免潜在边界错误:
for(pass=1;pass<size;pass++)
内容的提问来源于stack exchange,提问作者Yaaro Obba
相关产品推荐
相关产品推荐

