二分插入 bisect

2022-05-15 13:57:39 字數 1998 閱讀 1605

在乙個有序序列(從小到大)中查詢乙個元素

每次將元素與序列中間位置的元素進行比較

如果大於中點,則在後半段。如果小於中點,則在前半段。以此類推

時間複雜度為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...