二分法的问题
实现二分法不是很难。但是在网络上有些实现方法是错误的。问题出在终止循环、判断mid上。实现代码如下:
def bsearch(arr,v):
left,right=0,len(arr)
while left <= right:
mid = (left + right) // 2
if arr[mid] == v:
return mid
elif arr[mid] > v:
right = mid-1
else:
left = mid+1
else:
return -1
问题1:终止条件
终止条件应该是right>=left。有的实现方法用的是right>left,可能会出现死循环现象
问题2:right=mid-1
改变上下限时,right=mid是不正确的。应该是right=mid-1。left同理应该是mid+1
建议使用bisect中的二分法,速度快而且可以返回符合条件的下标。