应该分情况讨论,当函数返回的值是一个小数时,应选择小数左右两个数作为mid。list是python关键字,形参最好不要用
#添加math模块
import math
def binary_search(li, item):
#列表排序
li.sort()
low = 0
high = len(li) - 1
#如果item小于列表最小值,或大于最大值,返回错误,
#如果item=最小值或最大值,返回最小值或最大值对应的下标
if item < li[low] or item> li[high]:
return '错误'
elif item ==li[low]:
return low
elif item ==li[high]:
return high
while high - low>1:
#如果mid的类型为int,mid为列表中位数序号
if type((low + high)/2)==int:
mid = (low + high)/2
guess = li[mid]
if guess == item:
return mid
elif guess > item:
high = mid
else:
low = mid
#如果mid为小数,需要找列表中间的两个值
else:
#math.floor(i)向下取整,math.ceil(i)向上取整
mid=[math.floor((low + high)/2),math.ceil((low + high)/2)]
if li[mid[0]] == item:
return mid[0]
elif li[mid[1]] == item:
return mid[1]
elif li[mid[0]]<item<li[mid[1]]:
return [li[mid[0]],li[mid[1]]]
elif item<li[mid[0]]:
high = mid[0]
else:
low = mid[1]
#返回的是一个下标范围
return [low,high]
list1 = [1,2,3,5,7]
binary_search(list1, 2)