要求查找的数据有序排列。
先以数据的最小值为下界,最大值为上界,将要查找的数与当前数据中间的数进行对比,如果大了,就以当前中间数为新的下界,重新计算中值后对比;如果小了,就以当前中间数为新的上界,重新计算中值后对比;直到找到该数。
% 目的是查找目标数在数组中的位置
def binary_search(num, item): % num是目标数组,item 是待查找的目标数
low = 0 % 下界,有序列表第一个元素的索引
high = len(num)-1 % 上界,列表最后一个元素的索引
while low <= high % 确定查找的停止条件,即所查找的范围中一个元素都不剩
mid = (low + high)//2 % 计算中值元素所在的索引,这里使用整除,会向下取整;
guess = num[mid] % 找到对应的中值元素
if item == guess:
return mid
if item > guess: % 当要查找的数更大时,此时需要将下界更换成当前的mid
low = mid + 1 % 为了避免要查找的数是列表边界值从而陷入死循环,对下界值往后挪一位(不往前挪一位是因为下界往前挪一位可能没有元素了)
elif item < guess:
high = mid - 1 % 为了避免要查找的数是列表边界值从而陷入死循环,对上界值往前挪一位(不往后挪一位是因为上界往后挪一位可能没有元素了)
return None
num = [1, 2, 3]
item = 2
binary_search(num, item) # 返回索引为1
(1)数组必须是有序的;
(2)下界变更时往后挪一位和上界变更时往前挪一位——可以以如下的例子来理解:对于上界向前挪一位,假如要查找的数是5,在[0,1,2,3,4,5]中查找,如果不挪会陷入4的死循环;对于下界向后挪一位,假如要查找的数是0,在[0,1,2,3,4,5]中查找,如果不挪会陷入1的死循环。