用python編寫二分查詢演算法
阿新 • • 發佈:2018-11-13
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點:是要求待查表為有序表,且插入刪除困難。使用場景:不經常變動而查詢頻繁的有序列表。
思想:
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,
如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。
二分查詢(遞迴版)
def binary_search(alist, item):
"""二分查詢(遞迴版)"""
n = len(alist) # 獲取列表長度
if len(alist) == 0: # 傳入了一個空的列表,代表元素並未找到
return False
mid = n // 2
if item == alist[mid]:
return True # 元素找到
elif item < alist[mid]:
# 元素在左半部分,遞迴呼叫
return binary_search(alist[:mid], item)
else:
# 元素在右半部分,遞迴呼叫
return binary_search(alist[mid + 1:], item)
if __name__ == '__main__':
alist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
print(binary_search(alist, 3)) # False 未找到
print(binary_search(alist, 13)) # True 找到
二分查詢 (非遞迴版)
def binary_search(alist, item):
"""二分查詢 (非遞迴版)"""
start = 0
end = len(alist) - 1
while start <= end:
# 計算中間mid遊標的值
mid = (start + end)//2
if item == alist[mid]:
# 元素找到
return True
elif item < alist[mid]:
# 元素在左半部分,遞迴呼叫
end = mid -1
else:
# 元素在右半部分,遞迴呼叫
start = mid + 1
# 跳出迴圈,start>end表示元素不存在
return False
if __name__ == '__main__':
alist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
print(binary_search(alist, 3)) # False 未找到
print(binary_search(alist, 13)) # True 找到