二分查找:
条件:需要查找的元素所在的列表是一个有序列表。
重点:对比mid以后,确定新的左右边界,逐渐缩小边界。
关键词:li必须是一个有序列表。如何确定左右边界,如何移动左右边界。
一维列表的二分查找:
def binary_search(li,num): #定义二分查找函数
left=0 #初始化左边界
right=len(li)-1 #初始化右边界
while left<=right: #循环条件:左右边界没有交叉,则进行查找的循环。
mid=(left+right)//2 #初始化mid指针,将li从中间分开成两个部分。
if num>li[mid]: #如果需要查找的值是比中间值大
left=mid+1 #移动left到mid的右边去,舍去了left与mid之间的那个区域。
elif num<li[mid]: #如果需要查找的值比中间值要小
right=mid-1 #移动right到mid的左边,舍去了right与mid之间的那个区域。
else:#num==li[mid] 既不大于,也不小于,那么一定是等于
return mid
return -1 #不存在返回-1
二维列表的二分查找:
def binary_search_2(li,num):
height=len(li)#总行数
weight=len(li[0])#最大宽度
left=0#初始化左边界
right=height*weight-1 #初始化右边界
while left<=right:#循环条件:左右边界没有交叉,则进行查找的循环。
mid=(left+right)//2 #初始化mid指针。
mid_h=mid//weight#把mid的下标转换为二维列表的行数
mid_w=mid%height#把mid的下标转换为二维列表的列数
if num>li[mid_h][mid_w]:#如果需要查找的值是比中间值大
left=mid+1 #移动left到mid的右边去,舍去了left与mid之间的那个区域。
elif num<li[mid_h][mid_w]: #如果需要查找的值比中间值要小
right=mid-1#移动right到mid的左边,舍去了right与mid之间的那个区域。
else:既不大于,也不小于,那么一定是等于
return [mid_h,mid_w]
return [-1,-1] #不存在返回-1