1)初始时,考虑的元素区间是整个顺序表
2)取所考虑的元素范围内位置居中的那个元素(中间项),比较该元素和检索元素的关系,如果相等则检索结束,返回True
3) 如果检索元素大,则检索范围修改为中间项之后的半区间;如果检索元素小,则检索范围修改为中间项之前的半区间
二分查找有递归实现和循环实现方式,如下:
def binary_search(search_list, search_element): """二分查找:基于递归,返回是否存在该元素""" s_len = len(search_list) if s_len > 0: mid_element = s_len // 2 # 中间元素恰好为所要查询的元素 if search_list[mid_element] == search_element: return True # 所要查询的元素位于原序列左侧 elif search_list[mid_element] > search_element: return binary_search(search_list[:mid_element], search_element) # 所要查询的元素位于原序列右侧 else: return binary_search(search_list[mid_element+1:], search_element) return False if __name__ == "__main__": L1 = [1, 3, 5, 6, 12, 23, 34, 35, 43, 55, 65] print(binary_search(L1, 43)) print(binary_search(L1, 5)) print(binary_search(L1, 11)) print(binary_search(L1, 23))
def binary_search(search_list, search_element): """二分查找:基于循环,返回是否存在该元素""" s_len = len(search_list) # 利用索引值的改变,定位在原列表的查询范围 first_idx = 0 last_idx = s_len-1 # 当前面索引小于等于后面索引,执行查找;需要注意等号也成立 while first_idx <= last_idx: mid_idx = (first_idx + last_idx) // 2 if search_list[mid_idx] == search_element: return True elif search_list[mid_idx] > search_element: last_idx = mid_idx - 1 else: first_idx = mid_idx + 1 return False if __name__ == "__main__": L1 = [1, 3, 5, 6, 12, 23, 34, 35, 43, 55, 65] print(binary_search(L1, 43)) print(binary_search(L1, 5)) print(binary_search(L1, 11)) print(binary_search(L1, 23))
参考:数据结构与算法(python语言描述)裘宗燕
黑马python数据结构与算法系列课程
原文:https://www.cnblogs.com/pjsdly-NLP/p/12633566.html