1. 程式人生 > >用python編寫二分查詢演算法

用python編寫二分查詢演算法

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點:是要求待查表為有序表,且插入刪除困難。使用場景:不經常變動而查詢頻繁的有序列表。

思想:

首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,
如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

二分查詢(遞迴版)

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 找到