1. 程式人生 > >Python學習總結——二分法

Python學習總結——二分法

引子——練習

  • 有一個無序序列[37, 99, 73, 48, 47, 40, 40, 25, 99, 51],對其先排序輸出新列表。 分別嘗試插入20、40、41到這個新序列中合適的位置,保證其有序。
def insert_sort(orderlist, i):
    ret = orderlist[:]
    low = 0
    high = len(ret)   # 因為有整除,所以去掉減1,不影響整除2,但影響下一行判斷。防止大於所有數的插入有問題
    
    while low < high:     # 如果改為<= ,雖然最大數能滿足 ,但最小數會出現死迴圈問題
        mid = (low+high) // 2
        if i > orderlist[mid]:
            low = mid + 1
        else:
            high = mid
    ret.insert(low,i)
    return ret

二分

  • 二分前提是有序,否則不可以二分。
  • 二分查詢演算法的時間複雜度O(log n)

bisect模組

bisect.bisect_left(a,x, lo=0, hi=len(a))

  • 查詢在有序列表a中插入x的index。lo和hi用於指定列表的區間,預設是使用整個列表。如果x已經存在,在其左邊插入。返回值為index。

bisect.bisect_right(a,x, lo=0, hi=len(a)) 或 bisect.bisect(a, x,lo=0, hi=len(a))

  • 和bisect_left類似,但如果x已經存在,在其右邊插入。

bisect.insort_left(a,x, lo=0, hi=len(a))

  • 在有序列表a中插入x。等同於a.insert(bisect.bisect_left(a,x, lo, hi), x) 。

bisect.insort_right(a,x, lo=0, hi=len(a)) 或者 bisect.insort(a, x,lo=0, hi=len(a))

  • 和insort_left函式類似,但如果x已經存在,在其右邊插入。

應用

  • 判斷學生成績,成績等級A~E。其中,90分以上為’A’ , 80~89分為’B’ , 70~79分為’C’ , 60~69分為’D’, 60分一下為 ‘E’ 。
import bisect
def scores(score):
    lst = [60,70,80,90]
    clas = 'EDCBA'
    return clas[bisect.bisect(lst,score)]