二分查找
二分查找又称折半查找,它是一种效率较高的查找方法
原理
将数组分为三部分,依次是中值前,中值,中值后
将要查找的值与中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,
等于中值时直接返回
要求:
①必须采用顺序存储结构
②必须按关键字大小有序排列
递归版本
第一步: 找到中值(取整数)
第二步: 要查找的数和中值比较
第三步: 若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回
代码如下:
# 1.定义函数,二分查找
def binary_search(my_list,item):
"""
二分查找函数
:param my_list: 要查找的列表 必须有序
:param item: 要查找的元素
:return: 查找结果,找到True,未找到False
"""
# 1.1 获取列表的长度
n = len(my_list)
# 1.2 如果长度小于等于0,直接return False
if n <= 0:
return False
# 1.3 找到中间值的索引
mid = n // 2
# 1.4 开始比较,如果一样就返回True.
if item == my_list[mid]:
return True
# 1.5 如果要查找的值 < 中间值,就去: 中间值的左边找.
elif item < my_list[mid]:
end = mid -1
# 1.6 如果要查找的值 > 中间值,就去: 中间值的右边找
else:
start = mid +1
# 2.定义main函数,测试
if __name__ == '__main__':
# 2.1 定义列表,记录:要查找的元素
my_list = [9,21,55,76,89,99]
# 2.2 调用函数,二分查找,获取结果
result = binary_search(my_list,21)
# 2.3 打印结果
print(f'查找结果为:{result}')
非递归版本:
代码如下:
"""
# 1.定义函数,二分查找
def binary_search(my_list,item):
"""
二分查找函数
:param my_list: 要查找的列表 必须有序
:param item: 要查找的元素
:return: 查找结果,找到True,未找到False
"""
# 1.1 定义变量,记录:查找区间,开始索引 和结束索引
start = 0
end = len(my_list)-1
# 1.2开始循环查找
while start < end:
# 1.3计算中间索引
mid = (start + end) // 2
# 1.4具体的比较逻辑
if item == my_list[mid]:
return True
elif item < my_list[mid]:
end = mid - 1 # 如果目标值小于中间值,就去左侧查找
else:
start = mid +1 # 如果目标值大于中间值,就去左侧查找
# 1.5 走这里,说明没找到,返回结果即可.
return False
# 2.定义main函数,测试
if __name__ == '__main__':
# 2.1 定义列表,记录:要查找的元素
my_list = [9,21,55,76,89,99]
# 2.2 调用函数,二分查找,获取结果
result = binary_search(my_list,20)
# 2.3 打印结果
print(f'查找结果为:{result}')