Python學習總結——二分法
阿新 • • 發佈:2018-12-11
引子——練習
- 有一個無序序列[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)]