python3实现数据结构与算法30天-查找-二分查找(3)

二分查找,折半查找,在一个排好序的列表,列表元素lst[0:n],时间复杂度:O(logn)

思想:
1.确定初始下界上界(索引-index),下界0,上界列表长度减1
2.判断条件控制while循环,下界小于上界,中间值整除2向下取整,如不满足循环,说明列表无此元素
3.情况1,fast way,中间值索引对应的列表值等于要查找的数值,返回index
4.情况2,如果目标值在mid左侧,即上界应该从新确定,在mid左侧减1,赋值后进入下轮循环
5.情况3,如果目标值在mid的右侧,即下界应该从新确定,在mid右侧加1,赋值后进入下轮循环

代码:

import random

def binary_search(lst, val):
    left = 0
    right = len(lst)-1

    while left <= right: # 候选区有值
        mid = (left + right) // 2 # 向下取整
        if lst[mid] == val:
            return mid
        elif lst[mid] > val: # 目标值在mid左侧
            right = mid - 1
        else: # lst(mid) < val, 目标值在mid右侧
            left = mid + 1

    else:
        return None

if __name__ == "__main__":
    lst = [random.randint(0,50) for x in range(10)]
    lst.sort()
    val = random.choice(lst)
    print(binary_search(lst, val))
原文地址:https://www.cnblogs.com/davis12/p/14534622.html