python:二分查找

1、什么是二分查找?

所谓二分查找就是在一个有序并且无重复的列表中,对该列表的元素进行查找。假如我的列表是升序排列(即从小到大),那么查找的方式就为:将所有元素对半切开查找,也就是说从中间开始查找。如果中间的这个元素大于目标元素,则往前挨个查找,因为前边的是小的,那如果小于目标元素,则往后挨个查找,因为后边的都是大的。

2、特点

(1)必须针对于有序列表

(2)该列表必须无重复

(3)按下标索引查找

3、算法源码

def find(mylist,targer):
     """
    :param mylist: 有序并且无重复的列表
    :param targer: 目标数字
    :return: 返回找到的元素
    """
    # 先拿出索引,left表示第一个索引,right表示最后一个索引
    left ,right = 0, len(mylist)-1
    # 查找的范围为索引范围内
    while left <= right:
        # 每次都获取中间位置的索引
        index = (left + right) // 2
        # 通过索引获得元素
        result = mylist[index]
        # 如果相等
        if result == targer:
            # 那么将返回这个元素
            return result
       	# 如果所找到的元素小于目标数字
        elif result < targer:
            # 那么从0开始的索引就+1,这里我们不能在最后+1,因为很可能出现索引超出界限的异常
            left += 1
        # 如果所找到的元素大于目标数字,则最后的索引-1。如果从索引为0的开始减的话,那么元素右-1嘛?很明显没有
        else:
            right -= 1
    # 如果到最后查找完,没有在列表中找见,则返回None
    return None

if __name__ == '__main__':
    # 使用列表推导式创建列表
    mylist = [i for i in range(50)]
    # 目标数字
    target = 36
    # 调用函数并返回一个值
    result = find(mylist,target)
    # 输出该值
    print(result)

4、分析图

二分查找 python 递归 python中二分查找_python

5、总结

从理论上讲,二分查找法比顺序查找效率能稍微高出一半,但对于靠前的元素,比如1、2那么它这个效率就没有顺序查找的效率高,并且二分查找有一个缺点,就是每次与目标数字不匹配,那么都要+1,此时就出现了奇偶数的问题。比如偶数字10// 2 = 5,那么就是找到下标索引为5的元素,但是如果是奇数 11 // 2 =5,此时就出现了除不尽的问题,那么也就是说如果遇到奇数它有在循环里白循环了一次,所以循环的次数就多了,这就是二分法的缺点所在。