python 二分法查找

瘦欲@ 提交于 2020-02-26 17:41:42

二分法的适用条件

二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
  优点: 二分法查找效率特别高
  缺点: 二分法只适用于有序序列

二分法的主要思想是:

设查找的数组区间为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(使用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: 使用递归函数
# 仍然引入随机数模块, 拿到一个随机数列表
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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!