算法思想
將數據分成兩部分,並比較中間值與待查找數據大小,如果小於則在前半段查找,如果大於則在後半段查找。經過數次分割直到中間值等於待查數據或找不到待查數據爲止。
分析
- 時間複雜度:O(logn)。
- 數據必須是有序的,並且所有數據必須加載到內存中。
- 適用於不需增刪的靜態數據。
注:來源於吳燦銘《圖解數據結構-使用Python》
代碼實現
import random
class Search(object):
def binary_search(self, data, value):
"""
二分查找迭代法實現
:param data: list 待查找序列
:param value: int 待查數據
:return: int 索引(查找不到返回-1)
"""
low = 0
high = len(data) - 1
while low <= high:
mid = int((low + high) / 2)
if value < data[mid]:
high = mid - 1
elif value > data[mid]:
low = mid + 1
else:
return mid + 1
return -1
def binary_search_recursion(self, data, low, high, value):
"""
二分查找遞歸法實現
:param data: list 待查找序列
:param low: int low指針
:param high: int high指針
:param value: int 待查數據
:return: int 索引(查找不到返回-1)
"""
if low <= high:
mid = int((low + high) / 2)
if value < data[mid]:
return self.binary_search_recursion(data, low, mid - 1, value)
elif value > data[mid]:
return self.binary_search_recursion(data, mid + 1, high, value)
else:
return mid + 1
return -1
def main():
search = Search()
data = [0] * 10
for index in range(len(data)):
data[index] = random.randint(1, 10)
data = sorted(data)
print("待查找序列:", data)
res_index = search.binary_search_recursion(data, 0, len(data) - 1, 5)
print("結果索引爲:", res_index)
res_index = search.binary_search(data, 5)
print("結果索引爲:", res_index)
if __name__ == '__main__':
main()