Python 實現常見算法之二分法查找

什麼是搜索

  • 搜索(又叫查找)是在一個項目集合中找到一個特定項目的算法過程。搜索通常的答案是真的或假的,因爲該項目是否存在。 搜索的幾種常見方法:順序查找、二分法查找、二叉樹查找、哈希查找

什麼是二分法查找

  • 二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。
# 二分法查找基於Python語言的實現
'''
二分查找:
    二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。
    首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;
    否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。
    重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。
'''

def digui_search(wait_list, key):
    """
    二分發查找:遞歸法
    """
    # 設置列表長度
    n = len(wait_list)
    if n > 0:
        mid = n // 2
        if wait_list[mid] == key:
            return True
        elif key < wait_list[mid]:
            return digui_search(wait_list[:mid], key)
        else:
            return digui_search(wait_list[mid + 1:], key)
    return False


def nomal_search(wait_list, key):
    """
    二分發查找:非遞歸法
    """
    # 設置初始值
    mid = 0
    # 設置表長度
    n = len(wait_list)
    res_index = -1
    # 設置最新mid不能超過列表長度,否則會出現死循環
    while mid < n - 1:
        cur = (n + mid) // 2
        if wait_list[cur] == key:
            res_index = cur
            break
        elif wait_list[cur] < key:
            mid = cur 
        else:
            n = cur
    return res_index


if __name__ == "__main__":
    wait_list = [1,2,3,4,5,6,7,8,9]
    print(digui_search(wait_list, 8))
    print(digui_search(wait_list, 10))
    # 測試非遞歸法
    print(nomal_search(wait_list, 8))
    print(nomal_search(wait_list, 0))
發佈了264 篇原創文章 · 獲贊 202 · 訪問量 110萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章