python二分查找极大值_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=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。

ef16c449be63f189a3d6d8292ea8b71c.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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)

简单版

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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))

升级版

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值