本文用python3實現了二分查找算法,分別使用遞歸方法和非遞歸方法。
(一)遞歸實現
def binarySearch(s, k):
return binarySearch_c(s, 0, len(s) - 1, k)
def binarySearch_c(s, low, high, k):
if low > high:
return -1
mid = low + (high - low) // 2
if s[mid] == k:
return mid
elif s[mid] > k:
return binarySearch_c(s, low, mid - 1, k)
else:
return binarySearch_c(s, mid + 1, high, k)
for _ in range(int(input())):
s = list(map(int, input().split()))
k = int(input())
print(binarySearch(s, k))
(二)非遞歸實現
def binarySearch(s, k):
low = 0
high = len(s) - 1
while low <= high:
mid = low + (high - low) // 2
if s[mid] == k:
return mid
elif s[mid] > k:
high = mid - 1
else:
low = mid + 1
return -1
for _ in range(int(input())):
s = list(map(int, input().split()))
k = int(input())
print(binarySearch(s, k))
三個易錯的關注點:
1、循環退出條件:
low<=high,而不是low<high
2、mid的取值:
mid = (low + high) // 2 這種寫法可能造成溢出
mid = low + (high - low) // 2 正確寫法
mid = low + ((high - low) >> 1 位運算性能更優
3、low和high的更新:
low = mid + 1
high = mid - 1
最後,二分查找要基於順序表結構,並且是有序數組,其時間複雜度爲O( log (n) )。