代码改变世界

二分查找、折半查找(binary search)

2020-04-18 18:24  那个杰克  阅读(298)  评论(0编辑  收藏  举报

二分查找的原理

  • 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]))