一. 二分法的适用条件
二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
优点: 二分法查找效率特别高
缺点: 二分法只适用于有序序列
二. 二分法的主要思想是:
设查找的数组区间为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)