算法-二分法

二分法:

二分法:先把需要处理的数据排序,每次只找中间位置,这样做能够使得每次查找的数据数量减少一半。这种方法就是二分法。

范例:利用二分法找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个缺点,

 

posted @ 2019-02-16 16:56  舒畅123  阅读(296)  评论(0编辑  收藏  举报