給出一無序數列,要求對其進行排序。那麼我們可以使用氣泡排序或者插入排序來實現。然而,當該數列規模較大時,前述兩種排序方式的時間複雜度為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 ...