标签: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