sub:二分查找

sub:二分查找

使用二分查找的前提条件 #

  1. 顺序存储通过下标可得到关键字。
  2. 元素有序任取一个关键字,即可确定目标关键字是在它之后或是之后。
  3. 存在上下界

求中间点的位置 #

二分查找,求中间点的位置,有时会看到下面的代码:

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。

33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值