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

二分查找中mid值应在while循环开头还是结尾更新?

二分查找中mid值更新位置的差异分析

我在练习二分查找算法时发现,当循环条件为start <= end、计算式为mid = (start + end)/2且数值无溢出时,将mid值在while循环的开头或结尾进行更新,算法输出结果一致。相关代码如下:

头文件

#include <iostream>
#include <vector>
using namespace std;

主函数

int main(){
    vector<int> arr = {1,3,5,6,6,7,8,9,15};
    int size = arr.size();
    int element = 5;

    // binarySearch(vector<int> arr, int size, key)
    int index = binarySearch(arr, size, element);
    cout << element << " found at index " << index << endl;
    return 0;
}

mid在循环开头更新的函数代码

int binarySearch(vector<int> arr, int size, int key){
    int start = 0, end = size - 1;
    int mid = (start + end)/2;
    while(start <= end){
        // updating the value of mid
        mid = (start + end)/2;
        if(arr[mid] == key){
            return mid;
        }
        else if(key < arr[mid]){
            end = mid - 1;
        }
        else{
            start = mid + 1;
        }
    }
    return -1;
}

mid在循环结尾更新的函数代码

int binarySearch(vector<int> arr, int size, int key){
    int start = 0, end = size - 1;
    int mid = (start + end)/2;
    while(start <= end){
        if(arr[mid] == key){
            return mid;
        }
        else if(key < arr[mid]){
            end = mid - 1;
        }
        else{
            start = mid + 1;
        }
        // updating the value of mid
        mid = (start + end)/2;
    }
    return -1;
}

请问更新mid值的位置不同是否真的存在差异?


这两种写法在循环条件为start <= end、数值无溢出的前提下,功能上完全一致,但存在逻辑细节和代码冗余性的区别:

  • 初始mid的冗余性
    第一种写法里,初始化阶段的mid = (start + end)/2是完全多余的——进入循环后立刻会重新计算mid,这段代码可以直接删掉。而第二种写法的初始mid会被第一次循环直接使用,逻辑更紧凑。

  • 循环内的执行顺序
    第一种是先更新mid,再判断目标值;第二种是先判断当前mid对应的元素,再更新mid供下一次循环使用。但因为循环条件保证了每次计算mid时start <= end,所以两种顺序都不会出现索引越界的问题。

  • 极端场景的表现
    无论是数组只有单个元素、查找存在的元素还是查找不存在的元素,两种写法的执行流程最终都会得到相同的结果。

不过要注意,如果后续修改了循环条件(比如改成start < end),这两种写法可能会出现逻辑差异,但在你当前的设定下,二者没有功能上的区别。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:17:31