20190425-基于有序数组的二分查找法

时间:2021-08-20 22:13:01

前言:日常需要在一个有序序列里面是否包含目标值的时候需要一一遍历序列,然后进行对比,这种算法称之为简单查找。简单查找的特点是:每次只查找并且排除一个数。

现在我们提供一种更好的算法,如猜数字,告诉你目标数在0-100之间,通过猜测中间数字可以一次性排除多位数字。具体案例如下:

给定序列为1-100,目标数字是88,现在我们进行二分查找算法路线分析:

step1:猜测数字是50,告诉我们小了,此时我们将0-50都排除了

step2:猜测数字是剩下的有序序列的中间值75,告诉我们小了,此时我们将0-75都排除,仅剩76-100

step3:猜测数字是88,告诉我们猜对了

全程仅用了3步,下面用函数实现猜数字功能的两种算法

简单查找,times表示查找次数,按照上述例子,在1-100中查找88,需要查找88次

def find_num(lis,target_num):
    times=0
    for i in lis:
        time+=1
        if i==target_num:
            return time    

二分查找,times表示查找此次数,按照上述例子,在1-100中查找88,需要查找3次

def binary_find(lis,target_num):
    low =0
    high = len(lis)-1
    times=0
    while low<=high:
        times+=1
        mid = (low+high)//2
        print(lis[mid])
        if lis[mid]==target_num:
            return times
        elif lis[mid]>target_num:
            high = mid-1
        elif lis[mid]<target_num:
            low = mid+1
            
print(binary_find(list(range(1,101)),88))

二分查找的特点:

 二分查找接受一个有序序列,和一个指定元素,如果指定元素在序列中,函数可返回函数在序列的位置,每次都检查序列的中间元素mid =(low+high)/2,如果猜的数字小了,则修改low=mid+1,如果猜的数字大了则修改high=mid-1

二分查找仅能查找有序序列,无序序列不适用该方法