二分查找的优点:比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难
学习之前,在网上找了一些教程,测试过程中,总会有兼顾不到的地方,所以在此总结了一下,解决了大部分的漏洞。
如果还有什么问题,欢迎各位指正,代码如下
def sort_list(my_list):
# 首先将列表排序,这里用的是冒泡
for j in range(len(list_data)):
for i in range(len(list_data) - j - 1):
if list_data[i] > list_data[i + 1]:
list_data[i], list_data[i + 1] = list_data[i + 1], list_data[i]
return list_data
递归方式
def binary_search1(my_list, num):
# 递归
middle_index = len(my_list) // 2 # 算出中间索引
if middle_index == 1: # 如果剩下列表两个元素, 就不必递归了,直接判断
if num == my_list[0] or num == my_list[1]:
return True
else:
return False
if middle_index == 0: # 如果列表只有一个元素
if num == my_list[middle_index]:
return True
else:
return False
# 如果这个数字大于中间索引的数字, 使用切片递归查询
if num > my_list[middle_index]:
return binary_search1(my_list[middle_index:], num)
# 如果这个数字小于中间索引的数字, 使用切片递归查询
elif num < my_list[middle_index]:
return binary_search1(my_list[:middle_index + 1], num)
# 如果这个数字等于中间索引的数字,返回True
elif num == my_list[middle_index]:
return True
非递归方式
def binary_search2(my_list, num):
# 非递归
start = 0 # 开始位置索引
end = len(my_list) - 1 # 结束位置索引
while start <= end:
# 这个判断是为了防止找不到元素而无限循环
if end - start == 1:
if num == my_list[start] or num == my_list[end]:
return True
else:
return False
middle_index = (start + end) // 2
if num == my_list[middle_index]:
return True
elif num > my_list[middle_index]:
start = middle_index
else:
end = middle_index
return False
if __name__ == '__main__':
list_data = [2, 5, 1, 6, 4, 4, 8, 7]
my_list = sort_list(list_data)
print(binary_search1(my_list, 1))
print(binary_search2(my_list, 9))
打印结果如下
True
False