关于C语言二分搜索函数中while(low<=high)条件的疑问
二分搜索
while (low <= high)循环终止逻辑解析 首先明确:二分搜索的前提是数组已经排序,low和high代表当前要搜索的子数组的左右边界索引。while (low <= high)的意思是:只要当前搜索区间里还有元素(哪怕只剩一个元素,即low=high时),就继续搜索;当low > high时,说明整个数组都搜完了,目标值不存在,循环终止。
下面用具体例子拆解low > high的触发场景:
场景1:目标值比数组所有元素都小
假设排序数组为[2,4,6,8,10],要查找的searchKey=1:
- 初始状态:
low=0,high=4(覆盖整个数组) - 第一次循环:计算
middle=(0+4)/2=2,对应元素6比1大,所以调整右边界high=2-1=1 - 第二次循环:
low=0 <= high=1,计算middle=(0+1)/2=0,对应元素2还是比1大,调整右边界high=0-1=-1 - 此时
low=0,high=-1,0 > -1,循环终止,返回-1表示未找到目标。
场景2:目标值比数组所有元素都大
同样用数组[2,4,6,8,10],查找searchKey=11:
- 初始状态:
low=0,high=4 - 第一次循环:
middle=2,对应元素6比11小,调整左边界low=2+1=3 - 第二次循环:
low=3 <= high=4,middle=(3+4)/2=3,对应元素8比11小,调整左边界low=3+1=4 - 第三次循环:
low=4 <= high=4,middle=4,对应元素10比11小,调整左边界low=4+1=5 - 此时
low=5,high=4,5 > 4,循环终止,返回-1。
场景3:目标值在数组元素区间内但不存在
数组[2,4,6,8,10],查找searchKey=7:
- 初始状态:
low=0,high=4,middle=2,对应元素6比7小,调整左边界low=3 - 第二次循环:
low=3 <= high=4,middle=3,对应元素8比7大,调整右边界high=3-1=2 - 此时
low=3,high=2,3 > 2,循环终止,返回-1。
另外提个小细节:代码中返回-1但函数返回类型是size_t(无符号整数类型),这会导致-1被转换为一个极大的无符号值,实际使用时要注意这个类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Jason Dube
相关产品推荐
相关产品推荐

