數據結構學習——10—查找算法(二分查找)

一、二分查找

二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好
其缺點是要求待查表爲有序表,且插入刪除困難。
因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。

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

# -*- 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))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章