一. 二分法的适用条件
  二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
  优点: 二分法查找效率特别高
  缺点: 二分法只适用于有序序列 二. 二分法的主要思想是:
设查找的数组区间为array[low, high]
(1)确定该区间的中间位置k
(2)将查找的值T与array[k]比较. 若相等, 查找成功返回此位置, 否则确定新的查找区域, 继续二分查找.
区域确定如下: 1) T < array[k] 由数组的有序性可知T < array[k,k+1,……,high], 故新的区间为array[low,……,k-1]
2) T > array[k] 由数组的有序性可知T > array[low,……,k-1], 故新的区间为array[k,k+1,……,high]
每一次查找与中间值比较, 可以确定是否查找成功,不成功则当前查找区间将缩小一半, 递归查找即可. 三. 例题: 用二分法查找一个数是否在随机数列中
1. 方法1(使用while循环): 步骤1: 拿到一个有100个随机数的列表
import random   # 引入一个随机数模块
def random_100(amount):
li = []
for i in range(amount): # 循环多少次就拿多少个随机数
s = random.randint(0, 100)
li.append(s)
return li # 返回随机数列表
lst = sorted(random_100(100)) # count=100 拿到由100个随机数组成的列表lst,并将其排序(默认为升序)
步骤2: 任意输入一个数(范围是0~100),查看它是否在随机数列表中
n = int(input("请输入一个数:"))
left = 0 # 左临界点left = 0
right = len(lst) - 1 # 右临界点right = len(lst) - 1 while left <= right:
mid = (left + right) // 2 # 索引只能是整数,因此用地板除
if n > lst[mid]:
left = mid + 1
elif n < lst[mid]:
right = mid - 1
elif n == lst[mid]:
print("你输入的数在这个列表中,它的位置是{}".format(mid))
break
else:
print("你输入的数不在这个数列中")
2. 方法2: 使用递归函数
步骤1:
# 仍然引入随机数模块, 拿到一个随机数列表
import random
def random_100(amount):
li = []
for i in range(amount):
s = random.randint(0, 100)
li.append(s)
return li
lst = sorted(random_100(100))
步骤2:
# 定义一个递归函数
def func(n, lst):
left = 0 # 左临界点
right = len(lst) - 1 # 右临界点
if left <= right:
mid = (left + right) // 2
if n < lst[mid]:
new_lst = lst[:mid]
return func(n, new_lst)
elif n > lst[mid]:
new_lst = lst[mid + 1:]
return func(n, new_lst)
else:
print("你输入的数在这个列表中\n")
return True
else:
print("你输入的数不在这个列表中\n")
return False
步骤3:
while 1:
n = int(input("请输入你要查找的数:"))
func(n, lst)
3. 方法3: 使用递归函数(方法2的优化)
# 仍然引入随机数模块, 拿到一个随机数列表
import random
def random_100(amount):
li = []
for i in range(amount):
s = random.randint(0, 100)
li.append(s)
return li
lst = sorted(random_100(100)) # 定义一个递归函数
def func(n, lst, left=0, right=None):
if right == None:
right = len(lst) - 1
if left <= right:
mid = (left + right) // 2
if n < lst[mid]:
right = mid - 1
elif n > lst[mid]:
left = mid + 1
else:
print("你输入的数在这个列表中,它的位置{}\n".format(mid))
return True
return func(n, lst, left, right)
else:
print("你输入的数不在这个列表中\n")
return False while 1:
n = int(input("请输入你要查找的数:"))
func(n, lst)

最新文章

  1. [译]Dynamics AX 2012 R2 BI系列-规划分析的注意事项
  2. node.js http.get 和http.post 数据
  3. 查看 dmp 字符集
  4. IOS 面试 --- 动画 block
  5. Log4J使用笔记(转)
  6. Java 字符终端上获取输入三种方式
  7. css兼容问题 ie6,7
  8. Centos 使用yum安装MongoDB 4.0
  9. Java_设计模式之享元模式
  10. java框架之SpringBoot(13)-检索及整合Elasticsearch
  11. Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
  12. FileInputStream与FileOutputStream 复制文件例子代码
  13. c++ =&gt; new/delete
  14. SQL SERVER: 合并相关操作(Union,Except,Intersect)
  15. JEECG技术总结
  16. poj 1724 ROADS 很水的dfs
  17. 打扮IDEA更换主题
  18. Django ORM常用的函数以及修饰词
  19. @Transactional之Spring事务深入理解
  20. 获取n天后的日期

热门文章

  1. 【NOIP/CSP2019】D2T1 Emiya 家今天的饭
  2. WPF多值绑定及多值转换(MultiBinding和IMultiValueConverter)
  3. IP选项处理
  4. P4213【模板】杜教筛(Sum)
  5. MySQL5.7 (审计)通过init_connect + binlog 实现MySQL审计功能
  6. Cogs 58. 延绵的山峰(st表)
  7. 为什么我在mysql的my.cnf下找不到bind-address
  8. Win10配置Java环境变量
  9. C语言学习笔记5-程序结构
  10. MySQL备忘点(上)