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