基本思想:对于一个有序数组,从数组中间元素开始与target元素进行比较,target较大则到中间元素的右半部分继续二分查找,target较小则到中间元素的左半部分继续二分查找,相等则查找到了target缘故。
注意:
(1)必须是有序数组
(2)target元素可能找不到
两种实现方法:注意索引边界的不同。
def binarySearch(list, target):
left = 0
right = len(list) - 1
#在list[left...right]里查找target,注意是左闭右闭
while left <= right:
mid = (right + left) // 2 #取中间元素索引
if list[mid] == target:
return mid
elif target > list[mid]
left = mid + 1 #到list[mid + 1 ...right]里查找
else: #target < list[mid]
right = mid - 1 #到list[left ...mid - 1]里查找
return -1 #未找到target元素
def binarySearch(list, target):
left = 0
right = len(list)
#在list[left...right)里查找target,注意是左闭右开
while left < right:
mid = (right - left) // 2 + left #防止上面的写法整型溢出
if list[mid] == target:
return mid
elif target > list[mid]
left = mid + 1 #到list[mid + 1 ...right)里查找
else: #target < list[mid]
right = mid #到list[left ...mid)里查找
return -1 #未找到target元素
二分查找法的时间复杂度:O(logn)
3、循环不变量:在循环中不改变的量,即在循环开始和在循环迭代过程中永远保持不变的条件。
比如二分查找的第一个写法里循环开始和在循环迭代过程中要一直保持在list[left…right]左闭右闭的范围里查找target,这个条件就是一个循环不变量。
其他数据结构基本算法的Python实现版本可从github:全python实现的数据结构与算法中获取