【算法圖解】個(gè)人學(xué)習(xí)筆記1——二分查找
#二分查找算法是一種在有序數(shù)組中查找某一特定元素的搜索算法。
# 搜素過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,
# 則搜素過程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,
# 而且跟開始一樣從中間元素開始比較。如果在某一步驟數(shù)組為空,
# 則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。
# 折半搜索每次把搜索區(qū)域減少一半,時(shí)間復(fù)雜度為O(log2n)? 。
#兩種Python代碼示例如下:
def binary_search(list,item):
? ? #low為最小數(shù),high為最大數(shù)
? ? low=0
? ? #最大數(shù)high為查找元素-1
? ? high=len(list)-1
? ? #二分查找循環(huán),從中間開始尋找
? ? while low<=high:
? ? ? ? mid=int((low+high)/2)
? ? ? ? guess=list[mid]
? ? ? ? #判斷3中猜測情況
? ? ? ? if guess==item:
? ? ? ? ? ? return mid
? ? ? ? elif guess>item:
? ? ? ? ? ? return mid-1
?
? ? ? ? else:
? ? ? ? ? ? low=mid+1
? ? else:
? ? ? ? # 目標(biāo)不存在
? ? ? ? return None
My_list=[ 2, 3, 4, 10, 120,500,0]
My_item=800
result=binary_search(My_list,My_item)
if result != None:
? ? print ("元素在數(shù)組中的索引為 %d" % result )
else:
? ? print ("元素不在數(shù)組中")
# 返回 x 在 arr 中的索引,如果不存在返回 -1
#r為arr素組長度 x為查找目標(biāo)元素
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
?
# 測試數(shù)組
arr = [ 2, 3, 4, 10, 40 ]
x = 2
?
# 函數(shù)調(diào)用
result = binarySearch(arr, 0, len(arr)-1, x)
?
if result != -1:
? ? print ("元素在數(shù)組中的索引為 %d" % result )
else:
? ? print ("元素不在數(shù)組中")