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))
这样,我们就掌握了二分查找法在列表中的简单应用。

浙公网安备 33010602011771号