二分查找又叫折半查找,二分查找应该属于减治技术的成功应用。所谓减治法,就是将原问题分解成若干个子问题后,利用了规模为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=0for num inl: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]deffunc(l,aim):
mid= (len(l)-1)//2
ifl:if aim >l[mid]:
func(l[mid+1:],aim)elif aim
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 elseend
mid_index= (end-start)//2 +startif start <=end:if l[mid_index]aim:return find(l,aim,start=start,end=mid_index-1)else:return '索引为%s'%mid_index,aimelse:return '找不到这个值'
print(find(l,67))
升级版
这样,我们就掌握了二分查找法在列表中的简单应用。
1961

被折叠的 条评论
为什么被折叠?



