二分查找中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
相关产品推荐
相关产品推荐

