二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好
二分查找即搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果中間元素大於或小於要查找元素,則在小於或大於中間元素的那一半進行搜索,而且跟開始一樣從中間元素開始比較. 如果在某一步驟數組為空,則代表找不到.這種算法每一次比較都會使搜索范圍縮小一半.
適用條件:
二分查找是有條件的,首先是有序的,其次因為二分查找操作的是下標,所以要求是順序
最優時間復雜度:O(1), 最壞時間復雜度:O(logn)
下面我們假設數組是升序的情況下寫二分查找:
def binary_chop(alist, data): """ 非遞歸解決二分查找 """ n = len(alist) first = 0 last = n - 1 while first <= last: mid = (last+first)//2 if alist[mid] > data: last = mid - 1 elif alist[mid] < data: first = mid + 1 else: return True return False def binary_chop2(alist, data): """ 遞歸解決二分查找 """ n = len(alist) if n < 1: return False mid = n // 2 if alist[mid] > data: return binary_chop2(alist[0:mid], data) elif alist[mid] < data: return binary_chop2(alist[mid+1:], data) else: return True if __name__ == "__main__": lis = [2,4, 5, 12, 14, 23] if binary_chop(lis, 12): print('ok') else: print('false')