二分法查找
# 给定一个有序(升序)的列表与待查找的关键字,成功则返回其索引,失败则返回-1。
def halfsearch(a,x):
left=0
right=len(a)-1
mid=(left+right)//2
while(left<=right):
if a[mid]==x:
return mid
if a[mid]>x:
right=mid-1
else:#a[mid]<x
left=mid+1
mid=(left+right)//2
return -1
a=[1,2,2,3,4,6,7,8]
x=2
print(halfsearch(a,x))
# 二分法查找小于等于x的最大数
def halfsearch(a,x):
left=0
right=len(a)-1
mid=(left+right)//2
while(left<=right):
if a[mid]>x:
#若是小于x的最大数,这里应为a[mid]>=x
right=mid-1
else:#a[mid]<=x
left=mid+1
mid=(left+right)//2
return right
a=[1,2,2,3,4,6,7,8]
x=2
print(halfsearch(a,x))
#out:2
# 二分法查找大于等于x的最小数
def halfsearch(a,x):
left=0
right=len(a)-1
mid=(left+right)//2
while(left<=right):
if a[mid]>=x:
#若是大于x的最小数,这里应为a[mid]>x
right=mid-1
else:#a[mid]<x
left=mid+1
mid=(left+right)//2
if left==len(a):
return -1
return left
a=[1,1,1,3,4,6,7,8]
x=9
print(halfsearch(a,x))
思想:
针对有单调性的问题。
问法多数是最小值最大等等。
时间复杂度:
枚举时间复杂度是O(n),而二分是O(logn)