二分查找,非递归方法实现
def bin_search(lis,num):
left=0
right=len(lis)-1 #每次为取得中间的索引,因为索引是从0开始的
#比如列表中有六个数 (6-1)//2 =2 ,5个数(5-1)//2=2。如果不这样,在取得索引在减1,此时就需要考虑到列表中的数据是基数还是偶数
while left <= right:#循环条件
mid=(left+right)//2
if num < lis[mid]:#查询数据比中间数据小,就往左查询
right=mid-1 #到左边后,边界为中间数-1
elif num > lis[mid]:
left=mid+1#到右边后,边界为中间数+1
else:
return lis[mid] #查询的数与mid刚刚相等,则返回mid中间数。如果返回的是mid,则返回的是索引
return -1 #如果循环结束,左边大于右边,还没有查询到,则返回-1,代表没有查询到
lis =[11,21,43,55,3,2,54,21,44,66]
print(lis)
lis.sort()
print(lis)
print(type(lis))
while 1:
num = int(input('输入需要查询的数据:'))
res=bin_search(lis,num)
if res==-1:
print('未找到')
else:
print('找到了',res)
二分查找,通过递归实现
def search_num(lis,num,left,right): #lis代表列表、num代表需要查找的数,left、right为索引
if left>right:
return -1
#获取中间索引
mid=(left+right)//2 #//代表整除
if num < lis[mid]:
right=mid-1
elif num > lis[mid]:
left=mid+1
else:
return lis[mid]
return search_num(lis,num,left,right)
#需接收参数,不然会返回None
lis=[1,5,87,55,7,33,44,65,33,23]
lis.sort()
print(search_num(lis,23,0,len(lis)-1))