使用二分查找的前提条件 #
- 顺序存储通过下标可得到关键字。
- 元素有序任取一个关键字,即可确定目标关键字是在它之后或是之后。
- 存在上下界
求中间点的位置 #
二分查找,求中间点的位置,有时会看到下面的代码:
int mid = left + (right - left) / 2;
为什么不直接写成:
int mid = (left + right) / 2;
第二种写法可能会出现相加后超出整形范围的情形,而第一种写法下不会出现越界。
循环条件 #
使用二分搜索时,使用start <= end作为循环条件与使用start < end作为循环条件有何区别?
如果要在循环内部返回匹配的数据,则用start <= end。如果要先退出循环,然后用start和end的值来返回结果,那么就用start < end。
left=mid+1和right=mid-1 #
若mid所指元素确定并非目标元素,则可使用:
left = mid + 1, right = mid - 1
在
numbers[mid] > numbers[right]
此时mid所指一定不是最小值,所以left可设为mid+1。
numbers[mid] < numbers[right]
此时mid所指可能是最小值,所以right要设为mid,而不能设为mid-1。