二分法查找又称折半查找。二分法查找是在一个有序列表的基础上完成的,要查找的值x和列表的中间值m作比较,如果x大于m,那么接下来从m+1的右区间内再以相同方法取中间值做判断,循环往复此过程,直到判断出x=m的时候就是查找成功。否则相反。返回类型为布尔值
时间复杂度为 O(logn) 空间复杂度:O(1)
两种实现二分法查找的方法:递归、非递归 代码奉上
#递归实现:
defbinary_seach(alist,item):if len(alist) ==0:returnFalseelse:
mid= len(alist) // 2 #middle 记录中间位置索引
if item == alist[mid]: #如果查找元素与中间位置元素相等 则返回真
returnTrueelif item < alist[mid]: #如果查找元素小于中间位置元素,则进行列表切片缩小列表范围
returnbinary_seach(alist[:mid],item)else:return binary_seach(alist[mid+1:],item)if __name__ == '__main__':
alist= [5, 10, 15, 18, 35, 55, 65, 75, 99]print(binary_seach(alist,200)) #查找列表中不存在的数据
print("__________________")print(binary_seach(alist,15)) #查找列表中存在的数据
#非递归实现:
defbinary_seach(alist,item):
first= 0 #起始下标为0
last = len(alist) - 1 #列表最后一位的索引
while first <= last: #列表中间位置的索引值
mid = (first + last) // 2
if item ==alist[mid]:returnTrueelif item
last= mid -1
else:
first= mid + 1
else:returnFalseif __name__ == '__main__':
alist= [5,10,15,18,35,55,65,75,99] #有序序列
print(binary_seach(alist, 200))