算法-二分法
二分法:
二分法:先把需要处理的数据排序,每次只找中间位置,这样做能够使得每次查找的数据数量减少一半。这种方法就是二分法。
范例:利用二分法找66
1 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] 2 def find(l,aim,start=0,end=len(l)): 3 mid_index=(end-start)//2+start 4 if l[mid_index]<aim: 5 find(l,aim,start=mid_index+1,end=len(l)) 6 elif l[mid_index]>aim: 7 find(l, aim, start=start, end=mid_index-1) 8 else: 9 print('找到了',mid_index,aim) 10 find(l,66)
上面的代码是实现了找到66的这个数字的功能,但是存在几个缺点:
1、参数end,因为函数是被用来调用的,也就是说实际应用过程中没有l这个列表作为前提,那么自然也就不存在len(l),
2、返回值的问题,比如在第9行代码,不能只是简单的输出找到了,而应该将找到的这个参数能够应用于其他参数的调用。
3、目前66在这个列表中确实存在,但是也存在想找的数字不存在的情况,如果不存在怎么办
1 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] 2 def find(l,aim,start=0,end=None):#这里的end=None起到一个标识的作用, 3 end=len(l) if end is None else end#如果end的内容是空,则end=len(l),否则end就是在递归过程中代码传给的值 4 mid_index=(end-start)//2+start 5 if start<=end: 6 if l[mid_index]<aim: 7 return find(l,aim,start=mid_index+1,end=len(l)) 8 elif l[mid_index]>aim: 9 return find(l, aim, start=start, end=mid_index-1) 10 else: 11 return mid_index 12 else: 13 return '找不到' 14 ret=find(l,44) 15 print(ret)
通过上面对代码的优化就能彻底解决那3个缺点,