整数二分查找之前驱后继小细节
#前驱
def bin_search(a, n, x):#a有序序列,n是len(a),x是目标数
left = 0
right = n-1
while left < right:
mid = (left + right + 1) // 2 #右中位数 不加上1会陷入死循环
if a[mid] <= x:
left = mid
else:
right = mid - 1
return left
#后继
def bin_search(a, n, x): # 在数组a中找数字x,返回位置
left = 0
right = n-1
while left < right: # 右端点大于左端点则继续二分
mid = (right + left) // 2 # 左中位数
if a[mid] >= x:
right = mid # 小于中间点则中间点作为右端点
else: # a[mid] < x,只是大于,所以要left = mid + 1
left = mid + 1 # 大于中间点则中间点作为左端点
return left
a = [1,2,3,4,5,6,7,8,9,10]
n=len(a)
test = 57
pos = bin_search(a, n, test)
print("find =", a[pos])
理解:
1.什么是前驱?
找第一个小于等于x的数
2.为什么前驱是mid = (left + right + 1) // 2 ,而后继却是mid = (right + left)?
首先,先理解:假设循环到下面这种情况:
后继也是如此分析