二分查找也稱折半查找(Binary Search),這種搜索算法每一次比較都使搜索範圍縮小一半,是一種效率較高的查找方法。
概念
是一種在有序數組中查找某一特定元素的查詢算法。搜索過程從數組的中間元素開始,如果中間元素與要查找的元素相等,則搜索過程結束;如果查找元素大於或小於中間元素,則在數組大於或小於中間元素的那一半中進行查找,而且跟開始一樣從中間元素開始比較。重複以上過程,直到找到滿足條件的元素,使查找成功,或直到數組爲空爲止,此時查找不成功。
要求
必須採用順序存儲結構,且按關鍵字大小進行有序排列。
代碼舉例
#coding=utf-8
# 二分查找 (遞歸)
# 返回 x 在 lists 中的索引,如果不存在返回None
def binarySearch(lists, left, right, x):
# 如果右邊的值大於左邊的值
if right >= left:
# 取左右兩個數的中間值
mid = (left + (right - left) // 2)
# 若目標元素正好是中間位置,就返回mid,搜索過程結束
if lists[mid] == x:
return mid
# 元素小於中間位置的元素,比較左邊的元素,且移動right下標
elif lists[mid] > x:
return binarySearch(lists, left, mid - 1, x)
# 元素大於中間位置的元素,比較右邊的元素,移動left下標
else:
return binarySearch(lists, mid + 1, right, x)
else:
# 不存在的目標元素的情況就返回None
return
# 測試舉例數組
arr = [1, 2, 3, 4, 5]
x = 6
# 函數調用
result = binarySearch(arr, 0, len(arr) - 1, x)
if result != None:
print("您輸入的元素在數組中的索引爲 %d" % result)
else:
print("您輸入的元素不在數組中")
運行結果:
當x=3時;
運行結果