實現歸併排序並驗證時間複雜度

2021-10-11 12:20:30 字數 2125 閱讀 9814

給出一無序數列,要求對其進行排序。那麼我們可以使用氣泡排序或者插入排序來實現。然而,當該數列規模較大時,前述兩種排序方式的時間複雜度為o(n)=n^2,所以我們需要更加高效的排序演算法——歸併排序,時間複雜度o(n)=nlogn。

長度為1的數列為有序數列

就給出的兩個有序數列,可以通過不斷地比較第0個元素的大小並pop,使兩個數列逐漸「融合」為乙個有序數列

利用分治將原數列「拆散」又「融合」為乙個有序數列

def mergesort(lis):

num=len(lis)

com_num=0

if num==1:

return (lis,com_num)

la=lis[:num//2]

ra=lis[num//2:]

result=mergesort(la)

sla=result[0]

com_num+=result[1]

result=mergesort(ra)

sra=result[0]

com_num+=result[1]

result=merge(sla,sra)

sa=result[0]

com_num+=result[1]

return (sa,com_num)#為了擬合時間複雜度,此處返回乙個含基本操作次數的元組

def merge(la,ra):

a=com_num=0

while len(la) !=0 and len(ra) != 0:

com_num+=1

if la[0]>ra[0]:

else:

if len(la)==0:

a.extend(ra)

if len(ra)==0:

a.extend(la)#當某個數列元素全部被移除後,另乙個數列剩下部分直接接上

return (a,com_num)

def testmerge(scale):

num=0

for i in range(10):#就給定的資料規模,生成一隨機數列,重複排序10次取平均值

lis=random.sample(range(1,5*scale),scale)

num+=(mergesort(lis))[1]

num/=10

return num

import matplotlib.pyplot as plt

from scipy.optimize import*x=

list

(range(50

,5000

,250))

y=[]for i in x:

)print

(y[-1]

)#將兩個列表轉為numpy數列,以備擬合

x=np.array(x)

y=np.array(y)

#假設時間複雜度為nlogn

deffuc

(x,a,):

return np.log(x)

*x*a

popt,pcov=curve_fit(fuc,x,y)

#求擬合的r2成績

from sklearn.metrics import r2_score

y_pred=

[fuc(i,popt[0]

)for i in x]

r2=r2_score(y,y_pred)

#給出係數a,和最後的r2成績

print

("a:"

,popt[0]

)print

("r2_score:"

,r2)

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-**z4ksvv-1607259242796)(歸併法排序的實現與時間複雜度分析.assets/tim_cmp_ft.png)]

在程式實現中,我們假設f(n)=a*nlogn,這一假設擬合出的係數與實際資料吻合地很好,可見我們對其時間複雜度的假設是正確的。

-**z4ksvv-1607259242796)]

在程式實現中,我們假設f(n)=a*nlogn,這一假設擬合出的係數與實際資料吻合地很好,可見我們對其時間複雜度的假設是正確的。

歸併排序實現及時間複雜度分析

歸併排序思想 1.把序列分為兩部分,對兩部分分別排序 拆分的邊界條件 元素大於1個 2.合併已排序兩部分 時間複雜度分析 t 1 1 t n 2 t n 2 a n a為常數,每次合併時,複雜度為o n 2 2 t n 4 a n 2 a n 4 t n 4 2 a n 4 2 t n 8 a n ...

歸併排序時間複雜度分析

主要參考了他的博文,他還講解了其他排序的時間複雜度分析及演算法實現。可以說合併排序是比較複雜的排序,特別是對於不了解分治法基本思想的同學來說可能難以理解。總時間 分解時間 解決問題時間 合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間為一常數,時間複雜度o 1 解決問題時間是兩個遞迴式,把乙...

歸併排序演算法的時間複雜度

來自教程 我們對n個元素進行歸併排序,需要時間t n 那分解成兩個子陣列排序的時間都是t n 2 merge 函式合併的時間複雜度是o n 歸併排序的時間複雜度計算公式是 t 1 c n 1 時,只需要常量級的執行時間,所以表示為 c。t n 2 t n 2 n n 1 如何求t n 我們對t n ...