**必须是有序序列才可以使用二分查找。
1. 查找的数组中无重复元素:
方法一:非递归
def find(data,k):
first = 0
last = len(data)-1
while first <= last:
mid = (first+last)//2
if k == data[mid]:
return mid
elif k < data[mid]:
last = mid - 1
else:
first = mid + 1
if __name__ == '__main__':
arr = [1,2,3,4,5,7,8]
print(find(arr,1))
方法二:递归
def find(data,first,last,k):
mid = (first+last)//2
if k == data[mid]:
return mid
elif k < data[mid]:
last = mid - 1
else:
first = mid + 1
return find(data,first,last,k)
if __name__ == '__main__':
arr = [1,2,3,4,5,7,8]
print(find(arr,0,len(arr)-1,1))
2. 查找的数组中有重复元素(查找元素出现的第一个位置):
def Find(data,first,last,k):
mid = (first + last)//2
if k == data[mid]:
if mid == 0:
return mid
elif k == data[mid - 1]:
last = mid - 1
elif k != data[mid - 1]:
return mid
elif k < data[mid]:
last = mid - 1
else:
first = mid + 1
return Find(data,first,last,k)
if __name__ == '__main__':
arr = [1,2,3,3,4,4,5,7,8]
print(Find(arr,0,len(arr)-1,5))