#二分查找法:
二分搜索是一種在有序數組中查找某一特定元素的搜索算法。
搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;
如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。
如果在某一步驟數組為空,則代表找不到。
這種搜索算法每一次比較都使搜索范圍縮小一半。
方法一:(while循環法)
def binarySearch(arr,x): #自定義函數:arr:有序數組;x:待查找值
low,high=0,len(arr)-1 #初始查詢下標索引
while low<=high: #循環判斷
mid=int((low+high)/2) #獲取有序數組中間值下標索引
if x==arr[mid]: #判斷待查找值與中間索引值相同
return mid #返回索引下標
elif x>arr[mid]: #判斷待查值大於中間索引值時
low=mid+1 #開始索引下標賦新值
else: #判斷待查值小於中間索引值時
high=mid-1 #結束索引下標賦新值
return -1 #while循環判斷不成立時
#測試
arr=[2,3,4,10,40]
x=10
result=binarySearch2(arr,x)
print(result)
方法二:(遞歸法)
def binarySearch(arr,s,e,x): #自定義遞歸函數 arr:有序數組,s:開始索引下標,e:結束索引下標,x:待查值
if s<=e: #循環判斷
mid=int((e+s)/2) #獲取有序數組中間值下標索引
if arr[mid]==x: #判斷待查找值與中間索引值相同
return mid #返回索引下標
elif arr[mid] < x: #判斷待查值大於中間索引值時
return binarySearch(arr,mid+1,e,x) #遞歸:開始索引下標賦新值
else: #判斷待查值小於中間索引值時
return binarySearch(arr,s,mid-1,x) #遞歸:結束索引下標賦新值
else: #外層 if 循環判斷不成立時
return -1
#測試數組
arr=[2,3,4,10,40]
x=10
#函數調用
result=binarySearch(arr,0,len(arr)-1,x)
print(result)