一、二分查找
二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;
其缺點是要求待查表爲有序表,且插入刪除困難。
因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。
# -*- encoding: utf-8 -*-
"""
@File : _search.py
@Time : 2019/11/22 10:48
@Author : chen
"""
# 二分查找
#(非遞歸實現)
def binary_search(li, item):
first = 0
last = len(li) -1
while first <= last: # 當first和last相同時候,循環查找完整個列表了
mid = (first + last) // 2 # 需要放在循環內,不斷修改查找區間
if li[mid] == item:
return True
elif item < li[mid]:
last = mid - 1 # 搜索範圍改變
else:
first = mid + 1 # 搜索範圍改變
return False # 循環查找完整個列表,沒有結果
# (遞歸實現)
def bin_search(li, item):
if len(li) <= 0: # 當list元素小於1的時候,遍歷循環了整個list
return False
else: # 循環查找的過程中
mid = len(li) // 2 # 需要放在循環內,不斷修改查找區間
if li[mid] == item:
return True
else:
if item < li[mid]:
return bin_search(li[:mid], item) # 注意這裏的li[:mid]範圍問題 與列表最前端元素的查找有關
else:
return bin_search(li[mid+1:], item) # 注意這裏的li[mid+1:]範圍問題 與列表尾端元素查找有關
if __name__ == '__main__':
li = [3, 4, 13, 21, 32, 46, 55, 57, 77]
print(binary_search(li, 3))
print(binary_search(li, 5))
print(binary_search(li, 77))
print(bin_search(li, 3))
print(bin_search(li, 5))
print(bin_search(li, 77))