二元搜尋法
搜尋的值,與所有資料的中間值(中位數)做比對,必須先行排序。
若是有 n 筆資料,在最差的情況下,二分搜尋法總共需要比較 [log2n] + 1 次。
在數列 5,13,16,25,28,32,46,54 用二元搜尋法尋找46,會在第幾次比較中找到?
(A) 3
(B) 2
(C) 1
(D) 此數列無法使用二元搜尋法尋找
Ans: B
Python
#二分搜尋-必須是已排序數列,且任兩數不重複。
def binary_search(a,target):
#設置選取範圍的指標
low = 0 #左邊界
upper = len(a) - 1 #右邊界
i=0 #回合
while low <= upper:
mid = (low + upper) // 2 #取中間索引的值(除以2的商)
print("第",i,"回合,左",low,",中",mid,"[",a[mid],"],右",upper,end='')
#若target比中間的值大,將mid+1給左邊界,取右半
if a[mid] < target:
low = mid + 1
print(",取右半")
#若target比中間的值小,將mid-1給右邊界,取左半
elif a[mid] > target:
upper = mid - 1
print(",取左半")
#若target等於中間的值,則回傳
else:
print(",目標值")
return mid
i=i+1
print("第",i,"回合,左",low,",中",mid,"[",a[mid],"],右",upper)
return -1
a = list(map(int,input("輸入已排序數列:").split()))
target = int(input("尋找目標值:"))
found = binary_search(a,target)
if found == -1:
print("無法找到二元搜尋目標值",target)
else:
print("發現二元搜尋目標值",target,",索引值為",found)