排序和搜索(二)——python實現二分查找

【基本原理】
在上一篇有序列表的順序查找中,我們假定列表是按照值排好序的,基於排序的列表,我們按照python列表索引從頭開始比較。
而在二分查找中,我們先取中間索引位置,如果找到就返回;沒找到(升序排序),如果中間位置的值大於待查項,則排除中
間位置的值和比中間位置值大的另一半元素,如果待查項在列表中,肯定存在於小的半部分。重複此過程知道找到,返回
反過來也一樣
【二分查找分析】

列表有n項,第1次比較剩n/2,第2次比較剩n/4,第3次比較剩n/8,......,第i次比較剩n/2^i,最後剩一項,要麼是,要麼不是,故n/2^i=1,i=以2爲底n的對數。因此二分查找是O(log^n)。需注意排序和查找的花銷均衡

【代碼】
#實現二分查找
def binarySearchBasic(alist,item):
    first=0
    last=len(alist)-1
    post=(first+last)//2
    found=False
    while not found and first<=last:
        if alist[post]==item:
            found=True
            print('找到了,位置在',post+1)
        elif alist[post]<item:
            first=post+1
        else:
            last=post-1
        post = (first + last) //2
    return found
print(binarySearchBasic([1,3,5,7,9,12,45,89,91,95,96,98],12))

#遞歸實現二分查找
def binarySearchByRec(alist,item):
    if len(alist)==0:
        return False
    else:
        post=len(alist)//2
        # print(post)
        if alist[post]==item:
             return True
        elif alist[post]<item:
            return binarySearchByRec(alist[post+1:], item)
        else:
            return binarySearchByRec(alist[:post], item)

print(binarySearchByRec([1,3,5,7,9,12,45,89,91,95,96,98],12))

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