在乙個有序序列(從小到大)中查詢乙個元素
每次將元素與序列中間位置的元素進行比較
如果大於中點,則在後半段。如果小於中點,則在前半段。以此類推
時間複雜度為o(logn)
有乙個無序序列[37, 99, 73, 48, 47, 40, 40, 25, 99, 51],對其先排序輸出新列表。
分別插入20、40、41、100到這個新序列中合適的位置,保證其有序。
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin)
# print(origin)
# [25, 37, 40, 40, 47, 48, 51, 73, 99, 99]
# 有重複時從左邊插入
def insert_sort(origin:list, num):
low = 0
high = len(origin)
while low < high:
mid = (low + high)//2
# 如果大於中點,則在後半部分
if num > origin[mid]:
low = mid + 1
# 否則在前半部分
else:
high = mid
origin.insert(low, num)
for num in (20, 40, 41, 100):
insert_sort(origin, num)
print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin)
# 有重複時從右邊插入
def insert_sort(origin:list, num):
low = 0
high = len(origin)
while low < high:
mid = (low + high)//2
if num < origin[mid]:
high = mid
else:
low = mid + 1
origin.insert(low, num)
for num in (20, 40, 41, 100):
insert_sort(origin, num)
print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
bisect模組
bisect包含兩個主要函式 bisect和insort,都是基於二分法實現
import bisect
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin)
for num in (20, 40, 41, 100):
bisect.insort_left(origin, num)
print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
判斷學生成績,成績等級a-e,其中,90分以上為a,80-89為b,70-79為c,60-69為d,50-59為e
breakpoints = [60, 70, 80, 90]
grades = 'edcba'
index = bisect.bisect(breakpoints, 55)
print(grades[index])
# e
參考:
二分搜尋演算法
bisect模組二分插入
比如說 我想插入乙個事件 函式 到乙個佇列中去就可以用這個函式哦!示例 import bisect list 10,20,30 bisect.insort list,25 bisect.insort list,15 print list 輸出 10,15,20,25,30 哦!一切都明白了。說明白一...
二分插入排序
基本思想 1.取arr 1 為關鍵字key,將key插入前面已拍好的序列中。2.取arr 2 為關鍵字key,將key插入前面已拍好的序列中。3.取arr n 1 為關鍵字key,將key插入前面已拍好的序列中。include include define n 10 void binsertsort...
二分插入排序
include 二分插入法排序 二分排序的時間複雜度是o n logn 空間複雜度o 1 是穩定排序 void binary insert sort int a,int len else 如果當前元素比中間元素大,當前元素要插入到中間元素的右側 for j i 1 j high j 元素後移 a h...