二分查找的原理
-
1、首先找到列表中排在中间的元素,比较目标元素与该元素的大小,如果中间的元素等于目标元素,则返回对应的下标索引index,否则返回-1
-
2、如果目标元素比该元素大,则在中间元素与最后一个元素之间重复步骤1
-
3、如果目标元素比该元素小,则在中间元素与第一个元素之间重复步骤1
代码:
# 入参定义列表lis、起始索引left、终止索引right、查找元素num
def binary_search(lis, left, right, num):
if left > right: #递归结束条件
return -1 # 返回-1表示元素没有在列表中
mid = (left + right) // 2 #获取中间mid索引
if num < lis[mid]: # 判断中间索引对应的value 是否 小于要查找的值,
right = mid -1 # 若小于,起始索引不变,终止索引right = mid-1 取前部分列表的最后的索引值
elif num > lis[mid]:
left = mid + 1 # 若大于,起始索引取后部分列表的首位索引值,终止索引不变
else:
return mid # 中间值刚好等要查找的值,返回mid索引
return binary_search(lis, left, right, num)
#这里之所以会有return是因为必须要接收值,不然返回None
#回溯到最后一层的时候,如果没有return,那么将会返回None
list_item = [1,3,5,7,9,23,43,57,58,60,76,89,100]
index = binary_search(list_item,0,len(list_item)-1,2)
print("{0},{1}".format(index,list_item[index]))