二分查找法的python實現

1.非遞歸算法

def binary_search(lis, nun):
    left = 0
    right = len(lis) - 1
    while left <= right:   #循環條件
        mid = (left + right) // 2   #獲取中間位置,數字的索引(序列前提是有序的)
        if num < lis[mid]:  #如果查詢數字比中間數字小,那就去二分後的左邊找,
            right = mid - 1   #來到左邊後,需要將右變的邊界換爲mid-1
        elif num > lis[mid]:   #如果查詢數字比中間數字大,那麼去二分後的右邊找
            left = mid + 1    #來到右邊後,需要將左邊的邊界換爲mid+1
        else:
            return mid  #如果查詢數字剛好爲中間值,返回該值得索引
    return -1  #如果循環結束,左邊大於了右邊,代表沒有找到

lis = [11, 32, 51, 21, 42, 9, 5, 6, 7, 8]
print(lis)
lis.sort()
print(lis)
while 1:
    num = int(input('輸入要查找的數:'))
    res = binary_search(lis, num)
    print(res)
    if res == -1:
        print('未找到!')
    else:
        print('找到!')

2.遞歸算法

def binary_search(lis, left, right, num):

    if left > right: #遞歸結束條件
        return -1
    mid = (left + right) // 2
    if num < lis[mid]:
        right = mid -1
    elif num > lis[mid]:
        left = mid + 1
    else:
        return mid
    return binary_search(lis, left, right, num)
    #這裏之所以會有return是因爲必須要接收值,不然返回None
    #回溯到最後一層的時候,如果沒有return,那麼將會返回None

lis = [11, 32, 51, 21, 42, 9, 5, 6, 7, 8]
print(lis)
lis.sort()
print(lis)
while 1:
    num = int(input('輸入要查找的數:'))
    res = binary_search(lis, 0, len(lis)-1,num)
    print(res)
    if res == -1:
        print('未找到!')
    else:
        print('找到!')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章