二分查找(Binary Search),是一种效率较高的查找方法。在面试或算法竞赛中,查找相关的问题最优解通常就是二分查找。特别在现场面试中尤其重要,常用二分查找来考察面试者的编码能力和算法思维。
二分查找也称为折半查找。如果一个查找问题能够用一个条件消除一半的查找区域,那么就对目标在特定空间搜索,从而减少查找空间。
虽然二分查找思路比较直观,但大部分面试者通常在边界处理的时候考虑不全,从而出错。
有很多原因导致二分查找处理边界失败!例如,当目标位于数组第0
个索引时,或位于第(n - 1)
个索引时,程序进入死循环。
接下来,本问将对二分查找算法进行从零开始分析,总结出一套python实现二分查找的代码模板,并分析算法复杂度!
1. 算法模板
下面的代码是二分查找的一种标准实现方式:
left = 0
right = size of array # 数组的大小
while (left + 1 < right)
mid = (left + right) / 2 # 中间mid下标
if (array[mid] == target) # 检查已找到
return mid
else if (array[mid] < target)
continue search in right side # 在 右边区间搜索
else
continue search in left side # 在 左边区间搜索
if (array[left] == target) # 循环退出后进行判断
return left
return -1
逐一分析下上面伪代码:
-
第1行:
0
作为左边left
索引。 -
第2行:数组大小作为右边
right
索引。因此,当访问right
索引,需要小心越界。 -
第4行:当
left
和right
之间没有元素时,while
循环结束。因此,注意如果数组中仅有一个元素,将跳过这个循环,此时需要14行代码进行处理。 -
第14行: 在循环外检查
left
索引上的元素,因为循环退出时,它可能是需要查找的数字target
。
2. 编码实现
下面是完整的二分查找代码:
def binarySearch(nums, target