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

为什么我编写的C++非递归二分查找函数无法正常工作?

你的非递归二分查找问题分析

你的代码存在两个关键逻辑错误,导致无法正确工作:

1. 循环内未更新中间位置midpoint

你仅在函数开头计算了一次midpoint,但每次调整first或last缩小搜索区间后,必须重新计算新的中间位置。否则永远用初始的midpoint值判断,完全无法正确缩小搜索范围。
比如你的测试用例中,初始midpoint为3(对应值43),目标是12:第一次判断43>12,将last改为2,但midpoint仍为3,下一轮循环还是拿arr[3](43)和12对比,反复修改last直到循环结束,最终返回0,根本找不到正确下标1。

2. 未找到目标时的返回值有歧义

当前未找到目标时返回0,但0是数组的合法下标(比如查找元素4时,下标0是正确结果),这会让调用者混淆「找到下标0」和「未找到目标」两种情况。应该返回-1这类无效下标值。


修正后的代码

#include <iostream>

int binary_search(int arr[], int size, int target)
{
    int first = 0;
    int last = size - 1; 
    
    while(first <= last)
    {
        // 每次循环重新计算当前区间的中间位置
        int midpoint = first + (last - first) / 2; 
        if(arr[midpoint] == target)
        {
            return midpoint;
        }
        else if(arr[midpoint] < target)
        {
            first = midpoint + 1;
        }
        else
        {
            last = midpoint - 1;
        }
    }
    // 未找到目标返回无效下标
    return -1; 
}

int main()
{
    int arr[] = {4, 12, 23, 43, 50, 60, 230, 290};
    int size = sizeof(arr)/sizeof(arr[0]);
    int target = 12;
    int result = binary_search(arr, size, target);
    
    if(result != -1)
    {
        std::cout << "找到目标,下标为:" << result;
    }
    else
    {
        std::cout << "未找到目标";
    }
    return 0;
}

额外优化提示

计算midpoint时用first + (last - first)/2替代(first + last)/2,可以避免first和last数值过大时的整数溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:16:08