二分查找是我第一次面试时的编程题。
非递归方式:
# 二分查找非递归实现
def binary_search(list, item):
low = 0
high = len(list) - 1
while low <= high:
mid = (low + high)//2
guess = list[mid]
if guess == item :
return mid
if item > guess :
low = mid + 1
else:
high = mid -1
return None
#测试
my_list = [1,3,4,5,6,7,8,9]
print(binary_search(my_list, 5))
print(binary_search(my_list, 2))
个人认为要记住的点:首先要有查找范围,所以必须 low <= high .一旦超出这个范围说明要查找的数不存在,返回 None .
其次,二分查找就是缩小查找范围,方法就是不断改变 low 和 high .
最后,要说明的是一个python 语法, python 有两种除法,第一种是精确除法, " / " 这个除法的结果一定是 一个浮点类型的数。 第二种称为地板除," // " 这个其实就是取整。
递归方式:
#二分查找递归方式
def binary_s(list, low, high, item):
if low <= high:
mid = (low + high) //2
guess = list[mid]
if item == guess:
return mid
if item < guess:
binary_s(list, low, mid-1, item)
else:
binary_s(list, mid+1, high, item)
return None
#测试
my_list = [1,3,4,5,6,7,8,9]
print(binary_s(my_list, 0, len(my_list)-1, 5))
print(binary_s(my_list, 0, len(my_list)-1, 2))
递归方式与上面提到的一样,只要有查找范围,便去查找,没有范围了就说明没找到,返回 None.