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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:39:04