Python 二分查找算法

  二分查找又叫折半查找,二分查找应该属于减治技术的成功应用。所谓减治法,就是将原问题分解成若干个子问题后,利用了规模为n的原问题的解与较小规模(通常是n/2)的子问题的解之间的关系。 
二分查找利用了记录按关键码有序的特点,其基本思想为:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半边继续查找;若给定值大于中间记录的关键码,则在中间记录右半边区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败

 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
以我们以往的方法,可以使用index直接进行查找。
l.index(66)

又或者:

l =[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

i = 0
for num in l:
    if num == 66:
        print(i)
    i+=1

以上两种方法都可以成功找到66,那如果我们用二分查找法呢?

l =[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

  我们可以发现整个列表是从小到大的顺序进行排列的,根据二分查找的方法,每次找到列表中的中间值,此处为41,我们可以看出41<66,于是接下来我们撇除41及小于41的那部分内容,在剩下的区域中再次取中间值,然后再进行比较,发现67>66,于是在42-66这个区间进行查找,以此方法再进行查找直至最终找到66。

我们将所有的分析落实到代码上:

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def func(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print('找不到')
func(l,66)
func(l,6)
简单版
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim,start=0,end=None):
#定义列表,目标值,列表开始的索引和结束的索引
    end = len(l) if end == None else end
    mid_index = (end-start)//2 +start
    if start <= end:
        if l[mid_index]<aim:
            return find(l,aim,start=mid_index+1,end=end)
        elif l[mid_index]>aim:
            return find(l,aim,start=start,end=mid_index-1)
        else:
            return '索引为%s'%mid_index,aim
    else:
        return '找不到这个值'

print(find(l,67))
升级版

 这样,我们就掌握了二分查找法在列表中的简单应用。

posted @ 2018-01-09 16:28  amyleell  阅读(154)  评论(0)    收藏  举报