排序算法的python實現及算法分析——二分查找(Binary Search)

二分查找
在有序表的前提下采用分而治之(從中間項開始),這樣對比範圍就可以縮小爲n/2,
查找過程與實現原理:
將問題分解爲若干更小規模部分的問題,並將結果彙總得到原問題的解
在這裏插入圖片描述
python實現代碼:

###二分查找  普通版

def binarysearch(alist,item):
    first=0
    last=len(alist)-1
    found=False

    while first<=last and not found:
        midpoint=(first+last)//2
        if alist[midpoint]==item:
            found=True
        else:
            if item < alist[midpoint]:
                last=midpoint-1
            else:
                first =midpoint+1
    return found
## 測試實例
testlist1=[0,1,3,8,10,17,19,32,43]
print(binarysearch(testlist1,3))   	#True
print(binarysearch(testlist1,13))   #False

二分查找,在有序的前提下,先劃分區間,然後對比中間項,縮小問題規模,在劃分區間,接着對比然後縮小規模,恰好是遞歸算法的求解思路.。

## 二分查找,遞歸版

def binarysearch2(alist,item):
    if len(alist)==0:
        return False     ##基本結束條件
    else:
        midpoint=len(alist)//2
        if alist[midpoint]==item:
            return True
        else:
            if item <alist[midpoint]:
                return binarysearch2(alist[: midpoint],item)   #調用自身
            else:
                return binarysearch2(alist[midpoint+1 :],item)
##測試實例
testlist1=[0,1,3,8,10,17,19,32,43]
print(binarysearch2(testlist1,13))     # False
print(binarysearch2(testlist1,3))      # True

算法分析
二分查找每次比對都將範圍縮小一半,因此第i次時,其剩下範圍爲n/2^i,
對比次數足夠多時,範圍內就會僅剩1個數據項。因此得到: i=log2(n)
綜上:二分查找的算法複雜度爲O(log n)

注意:二分查找時需要考慮對數據項進行排序的開銷,若僅排序一次,可忽略其時間,若數據經常變動,則排序耗時長,可能還沒順序查找來的快!

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