二分查找存在两个场景,第一种就是在排好序的列表中进行查询,是否存在目标数 target,返回布尔类型,第二种是插入的情况,我需要把数插入到列表中,返回idx。
查询
def find(sortlist, lenn, target):
left, right = 0, lenn - 1
while left <= right:
mid = (right + left) // 2
midnum = sortlist[mid]
if midnum < target:
left = mid + 1
elif midnum > target:
right = mid - 1
else:
return True
return False
写法二:
def find(sortlist, lenn, target):
left, right = 0, lenn - 1
while left < right:
mid = (right + left) // 2
midnum = sortlist[mid]
if midnum < target:
left = mid + 1
elif midnum > target:
right = mid
else:
return True
return False
插入
这边只展示右插入的情况,返回的是插入的位置
def bisect_right(sortlist, lenn, addval):
left, right = 0, lenn
while left < right:
mid = (left + right) // 2
if addval < sortlist[mid]:
right = mid
else:
left = mid + 1
return left
同样的,逆序插入
def getaddidx(curstones, stone):
left, right = 0, len(curstones)
while left < right:
mid = (left + right) // 2
if curstones[mid] < stone: #不同之处
right = mid
else:
left = mid + 1
return left