python二分法结果图_Python 利用二分法查询数据

一. 二分法的适用条件

二分法查找适用于数据量较大时, 但是数据需要先排好顺序.

优点: 二分法查找效率特别高

缺点: 二分法只适用于有序序列

二. 二分法的主要思想是:

设查找的数组区间为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 #引入一个随机数模块

defrandom_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

right= mid - 1

elif n ==lst[mid]:print("你输入的数在这个列表中,它的位置是{}".format(mid))break

else:print("你输入的数不在这个数列中")

2. 方法2: 使用递归函数

步骤1:

#仍然引入随机数模块, 拿到一个随机数列表

importrandomdefrandom_100(amount):

li=[]for i inrange(amount):

s= random.randint(0, 100)

li.append(s)returnli

lst= sorted(random_100(100))

步骤2:

#定义一个递归函数

deffunc(n, lst):

left= 0 #左临界点

right = len(lst) - 1 #右临界点

if left <=right:

mid= (left + right) // 2

if n

new_lst=lst[:mid]returnfunc(n, new_lst)elif n >lst[mid]:

new_lst= lst[mid + 1:]returnfunc(n, new_lst)else:print("你输入的数在这个列表中\n")returnTrueelse:print("你输入的数不在这个列表中\n")return False

步骤3:

while 1:

n= int(input("请输入你要查找的数:"))

func(n, lst)

3. 方法3: 使用递归函数(方法2的优化)

#仍然引入随机数模块, 拿到一个随机数列表

importrandomdefrandom_100(amount):

li=[]for i inrange(amount):

s= random.randint(0, 100)

li.append(s)returnli

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

right= mid - 1

elif n >lst[mid]:

left= mid + 1

else:print("你输入的数在这个列表中,它的位置{}\n".format(mid))returnTruereturnfunc(n, lst, left, right)else:print("你输入的数不在这个列表中\n")returnFalsewhile 1:

n= int(input("请输入你要查找的数:"))

func(n, lst)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值