二分法排序 Python實現

2022-08-18 09:18:16 字數 2855 閱讀 4257

有乙個無序序列[37,99,73,48,47,40,40,25,99,51],先進行排序列印輸出,分別嘗試插入20/40/41 數值到序列中合適的位置,保證其有序。

第一種實現,利用巢狀for迴圈,每次迭代出來的數值進行比較。如果比原表中的數值小,則插入到這個數左面。

lst1 = [37,99,73,48,47,40,40,25,99,51]

lst = sorted(lst1)

for x in (20,40,41,100):

i = 0

for i,v in enumerate(lst):

if v > x:

break

lst.insert(i,x)

print(lst)

排序後二分查詢到適當位置插入數值。

排序使用sorted解決,假設公升序輸出。

查詢插入點,使用二分查詢完成。

假設全長為n,首先在大致的中點元素開始和待插入的數進行比較,如果大則和右邊的區域的中點元素進行比較,如果小則和左邊的區域的中點進行比較,以此類推。

lst = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]

lst1 = sorted(lst)

def lst_insert(lst1,i):

ret = lst1

# print(ret)

length = len(lst1)

low = 0

while low < length:

mid = length // 2

if ret[mid] < i:

low = mid + 1       #說明i大,右邊,限制下限。

else:

length = mid      #說明i不大於,左邊,限制上限。

ret.insert(low,i)

print(ret)

for x in (40,20,21):

lst_insert(lst1,x)

演算法的核心就是折半至重合為止。

1)二分的前提是有序,否則不允許。

2)二分的查詢演算法的時間複雜度是o(log n)

提供的函式有:

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如果已經存在,在其右邊插入。

函式可以分為兩類:

bisect系,用於查詢index。

insort系,用於實際插入。

預設重複時候從右邊插入。

import bisect

lst = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]

lst1 = sorted(lst)

print(lst1)  #[25, 37, 40, 40, 47, 48, 51, 73, 99, 99]

print(20,bisect.bisect(lst1,20))    #20 0

print(30,bisect.bisect(lst1,30))    #30 1

print(40,bisect.bisect(lst1,40))    # 40 4

print(100,bisect.bisect(lst1,100))    #  100 10

print(20,bisect.bisect_left(lst1,20))   #20 0

print(30,bisect.bisect_left(lst1,30))   #30 1

print(40,bisect.bisect_left(lst1,40))   #40 2

print(100,bisect.bisect_left(lst1,100))   # 100 10

for x in (20,30,40,100):

bisect.insort_left(lst1,x)

print(lst1)

# [20, 25, 37, 40, 40, 47, 48, 51, 73, 99, 99]

# [20, 25, 30, 37, 40, 40, 47, 48, 51, 73, 99, 99]

# [20, 25, 30, 37, 40, 40, 40, 47, 48, 51, 73, 99, 99]

# [20, 25, 30, 37, 40, 40, 40, 47, 48, 51, 73, 99, 99, 100]

判斷學習成績,成績等級a-e  。90分以上為a ,80 以上為b  ,70以上為c  60以上為d。60以下為d。

def insert_score(nums):

lst = [60, 70, 80, 90]

grades = "edcba"

index = bisect.bisect(lst,nums)

print(index)

print(grades[index])

insert_score(70)

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

二分法python實現

聚會遊戲,乙個人想乙個數,其他人來猜,然後告訴你猜大了還是小了,直到猜到這個數。二分法和猜數遊戲類似,只不過猜的時候一定猜最中間的那個數,折半查詢所需內容,就陣列來說,陣列越長,梯度下降越快,二分查詢優勢越明顯。python 如下 1 defbinary search list,item 2 low...

python實現二分法查詢

搜尋是在乙個專案集合中找到乙個特定專案的演算法過程。搜尋通常的答案是真的或假的,因為該專案是否存在。搜尋的幾種常見方法 順序查詢 二分法查詢 二叉樹查詢 雜湊查詢 二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經...