二分查找
一. 定义
#二分查找又叫做折半查找 优点:比较次数较少,查找速度快,平均性能好 缺点:需要列表是有序的,且插入删除困难 所以二分查找适用于不经常变更的有序列表。 二分查找利用了记录按关键码有序的特点,其基本思想为:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半边继续查找;若给定值大于中间记录的关键码,则在中间记录右半边区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。 二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
二. 算法图解

三. 代码实现
a = [1,2,10,30,33,99,101,200,301,311,402,403,500,900,1000] #while循环实现 def binary_search(array, item): start, end = 0, len(array)-1 while start <= end: mid_index = (start + end) // 2 if item == array[mid_index]: return mid_index elif item < array[mid_index]: end = mid_index - 1 else: start = mid_index + 1 else: return -1 #递归实现 def binary_search2(array, item, start, end): if start>end: return -1 mid = (start+end)//2 if item == array[mid]: return mid elif item < array[mid]: return binary_search2(array, item, start, mid-1) else: return binary_search2(array, item, mid+1, end) print(binary_search(a, 500)) print(binary_search2(a, 500, 0, len(a)-1)) #result 12 12
def binary_search4(lst, target): mid_index = len(lst)//2 if len(lst) > 0: if lst[mid_index] > target: return binary_search4(lst[:mid_index], target) elif lst[mid_index] < target: return binary_search4(lst[mid_index+1:], target) else: return True else: return False
# 只能查询是否存在,无法获得索引
bisect模块提供一个查找的方法,内部实现就是二分查找
import bisect def binary_search_mo(lst, target): ret = bisect.bisect_left(lst,target) print(ret) if ret != len(lst) and lst[ret] == target: return ret else: return -1 print(binary_search_mo(l, 100))
浙公网安备 33010602011771号