二分法查找适用方法:
1.要求操作对象必须是排序过后的
2.操作对象支持下标索引,必须是连着放的,
即有序的顺序表
1. 递归搜索
这里普及一个切片的知识
字符串[开始索引:结束索引:步长] ,字符串截取遵循“左闭右开”原则,也叫“包左不包右”
**a[:mid]😗*从第一个位置到mid-1的位置,不包括mid, 指的是截取 mid 左边的数组 a[1]到a [mid-1]
**a[mid:]😗*从mid+1到n,不包括 n,指的是截取 mid 右边的数组 a[mid+1]到a [n]
def binary_search(a, item):
n = len(a)
if n > 0:
mid = n //2
if a[mid] == item:
return True
elif a[mid] > item:
return binary_search(a[:mid], item)
else:
return binary_search(a[mid + 1:], item)
return False
list = [1, 4, 5, 22, 8, 2]
result = binary_search(list, 22)
print(result)
2. 非递归正常比较
思路:
alist[mid]中间值大于目标值,取左边的区间
alist[mid]中间值小于目标值,取右边的区间
判断循环条件:
low <= high
相等时,说明区间只剩下一个值,还是需要比较执行下面循环的
def binary_search(alist, item):
low = 0
high = len(alist) - 1
while low <= high:
mid = (low + high) //2
if alist[mid] == item:
return True
elif item < alist[mid]:
high= mid - 1
else:
low = mid+ 1
return False
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))