Python二分查找代码异常排查:零售商品搜索功能故障求助
二分查找功能故障排查与修复
你的二分查找代码存在多个核心错误,导致无法正确判断商品编码是否存在,以下是问题分析和修复方案:
问题点梳理
二分查找的前提条件未满足
二分查找要求目标列表必须是有序的,但你定义的item_list是无序的,这直接导致二分查找逻辑从根本上失效。循环逻辑完全错误
原代码用if start >= end作为判断条件,初始状态start=0、end=14,此时start < end会直接进入else分支返回-1,所以无论输入什么编码,二分查找都会返回未找到。正确的逻辑应该用while start <= end循环持续缩小查找范围。指针更新方向错误
- 当
item_list[mid] > code时,目标值应该在左半区间,需将end设为mid - 1,而非mid + 1 - 当
item_list[mid] < code时,目标值应该在右半区间,需将start设为mid + 1,而非mid - 1
- 当
返回值判断的逻辑漏洞
原代码找到元素时返回索引,未找到返回-1,但调用时用if result判断:若元素在索引0的位置,result=0会被Python视为布尔值False,导致误判为未找到。
修复后的完整代码
print("WELCOME TO OUR SHOP") print("-------------------") # 线性查找函数(逻辑正确,无需修改) def linear_search(code, item_list): for i in range(len(item_list)): if item_list[i] == code: return True return False # 修复后的二分查找函数 def binary_search(item_list, code): start = 0 end = len(item_list) - 1 # 使用while循环持续缩小查找范围 while start <= end: mid = (start + end) // 2 # 用整数除法更简洁 if item_list[mid] == code: return mid # 找到返回索引 elif item_list[mid] > code: end = mid - 1 # 目标在左半区,调整右边界 else: start = mid + 1 # 目标在右半区,调整左边界 return -1 # 循环结束未找到,返回-1 # 预定义商品编码列表 item_list = [4599, 3102, 1024, 9980, 2912, 1569, 4205, 9811, 1001, 7638, 4733, 1989, 5555, 5000, 3861] # 获取用户输入 code = int(input("Find an item: \n")) # 线性查找执行与输出 result = linear_search(code, item_list) print("\nLinear Search") print("searching...\n") print(f"The Item {code} was found." if result else f"The Item {code} was not found.") # 二分查找执行与输出:先对列表排序(二分查找必须基于有序列表) sorted_item_list = sorted(item_list) result = binary_search(sorted_item_list, code) print("\nBinary Search") print("searching...\n") # 修正判断逻辑:只要返回值不是-1就表示找到 print(f"The Item {code} was found." if result != -1 else f"The Item {code} was not found.")
关键说明
- 二分查找前必须对列表执行
sorted()排序,否则无法正确缩小查找范围 - 修复后的循环逻辑会持续迭代直到找到元素或范围耗尽
- 调整了指针更新的方向,确保每次都能正确缩小查找区间
- 修改了返回值的判断条件,避免索引0被误判为未找到
内容的提问来源于stack exchange,提问作者shaaiitoo
相关产品推荐
相关产品推荐

