二分查找
定义:是一种在有序数组中查找某一特定元素的搜索算法。
1)从中间开始找。
2)如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找。
代码实现
第一种代码实现:
#返回x在arr中的索引,如果不存在返回-1
#返回x在arr中的索引,如果不存在返回-1
def binarySearch(arr,l,r,x):
#基本判断
if r>=l:
mid=int(l+(r-l)/2) #定义一个中间的位置
#元素整好的中间位置
if arr[mid]==x:
return mid
#元素小于中间位置的元素,只需要再比较左边的元素
elif arr[mid]>x:
return binarySearch(arr,l,mid-1,x)
#元素大于中间位置的元素,只需要再比较右边的元素
else:
return binarySearch(arr,mid+1,r,x)
else:
#不存在
return -1
arr=[6,2,8,3,9]
x=9
#函数调用
result=binarySearch(arr,0,len(arr)-1,x)
if result!=-1:
print("元素在数组中的索引为:%d"%result)
else:
print("元素不在数组中!")
----------------------------------------------
第二种方法实现
1)确定该期间的中间位置K
2)将要查找的值T与arr【k】比较,若相等,查找 成功返回此位置;否则 确定新的查找区域,继续查找;
arr[k]>T,arrary[k,k+1,....high],array[low....k-1]
arr[k]<T,array[k+1,.....,high]
def BinarySearch(array,t):#t为目标值
low=0 #最小的值
height=len(array)-1#最大的值
while low<height:#如果小的值比大的值
mid=int((low+height)/2)
if array[mid]<t:
low=mid+1
elif array[mid]>t:
height=mid-1
else:
return array[mid]
return -1
array=[3,7,12,56,37,0,56]
result=BinarySearch(array,12)
if result!=-1:
print("元素在数组中的索引为:%d"%result)
else:
print("元素不在数组中!")
--------------------------------------
方法三:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def binarySearch(A, target):
low,high = 0,len(A)-1
while low <= high:
mid = low + (high - low) #为了防止数值溢出,mid
if A[mid] == target:
return mid
elif A[mid] > target:
high = mid - 1
else:
low = mid + 1
return -1
A = [1,3,3,5, 7 ,7,7,7,8,14,14]
result=binarySearch(A,7)
if result!=-1:
print("元素在数组中的索引为:%d"%result)
else:
print("元素不在数组中!")
# 其中,有几个要注意的点:
# 循环的判定条件是:low <= high
# 为了防止数值溢出,mid = low + (high - low)/2
# 当 A[mid]不等于target时,high = mid - 1或low = mid + 1
#必须在有序数列中查找
时间复杂度:O(log2n)
二分查找前提是查找的序列有序