python实现二分查找(无bug)

    xiaoxiao2025-09-09  65

    二分查找的优点:比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难

    学习之前,在网上找了一些教程,测试过程中,总会有兼顾不到的地方,所以在此总结了一下,解决了大部分的漏洞。

    如果还有什么问题,欢迎各位指正,代码如下

    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
    最新回复(0)