码迷,mamicode.com
首页 > 其他好文 > 详细

二分法

时间:2018-08-15 18:34:43      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:highlight   查找   有序   print   小数   while   局限性   数据   通过   

二分法

每次能够排除掉一半的数据. 查找的效率非常高. 但是局限性比较大. 必须是有序列列才可以使用二分查找

核心: 掐头去尾取中间. 一次砍一半
两种算法: 常规循环, 递归循环

常规循环

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
n = 66#目标数字
left=0
right=len(lst)-1
while left<=right:  #边界,当右边比左边还小的时候突出循环
    mid=(left+right)//2 #必须是整除,因为索引没有小数
    if lst[mid]<n: #取右半段
        left=mid+1
    elif lst[mid]>n:#取左半段
        right=mid-1
    elif lst[mid]==n:
        print("找到了",mid)#打印索引
        break
else:
    print("没有这个数")

递归循环

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
def erfen(n,left,right,lst):
    mid=(left+right)//2
    if left<=right: #边界
        if lst[mid]<n:
            left=mid+1
            return erfen(n,left,right,lst)  #深坑,函数的返回值只能返回给调用者,如果不加return,返回的都是None
        elif lst[mid]>n:
            right=mid-1
            return erfen(n,left,right,lst)  #深坑,函数的返回值只能返回给调用者,如果不加return,返回的都是None
        elif lst[mid]==n:
            print("找到了")
            return mid  #通过return返回,终止递归
    else:
        print("没找到")
        return -1   #找不到返回-1
#左边界起始是0,右边界是len(lst)-1
a=erfen(43,0,len(lst)-1,lst)
print(a)

  

二分法

标签:highlight   查找   有序   print   小数   while   局限性   数据   通过   

原文地址:https://www.cnblogs.com/amber-liu/p/9482985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!