演算法導論2 3練習答案

2021-10-16 17:32:09 字數 1472 閱讀 4993

使用哨兵的歸併排序(merge-sort)見文章:c語言實現歸併排序

無哨兵版:

#include

#include

#include

#include

void

merge

(int a,

int p,

int q,

int r)

//r中的元素複製完畢,只需繼續複製l中的

else

if(j >= n2)

//從l、r陣列中取更小的元素插入a陣列

else

if(l[i]

<= r[j]

)else

}free

(l);

free

(r);

}void

mergesort

(int a,

int p,

int r)

}main()

;mergesort

(a,0,7

);for(

int i =

0; i <

8; i++

)printf

("%d "

, a[i]);

}

t(n

)=2 &\text{},n=2\\ 2t(n/2)+n &\text{},n=2^k(k>1) \end

t(n)

= \theta(1) &\text{},n=1\\ t(n-1)+\theta(n) &\text{},n>1 \end

t(n)

= \theta(1) &\text{},n=1\\ t(n/2)+\theta(1) &\text{},n>1 \end

t(n)={

θ(1)

t(n/

2)+θ

(1)​

,n=1

,n>1​

可自行使用遞迴樹進行分析,設遞迴樹的高度為h,則2h=n,共有(lgn + 1)個 θ(1)。

所以最壞情況下 t(n) = (lgn + 1)θ(1) = θ(lgn)。

不可以

演算法分析與**實現:二分查詢插入排序(優化的直接插入排序)

最壞情況下需要對1 + 2 + 3 + … + (n - 1) = n(n - 1)/2個元素後移,需要的賦值操作次數為n(n - 1)/2 + (n - 1),排序的時間複雜度仍為o(n2)。

首先使用歸併排序對集合s進行排序,這一步的執行時間為o(nlgn),然後對s中任一元素 si 使用二分查詢在子串行 s[i+1…n] 中檢索值為 x - si 的元素。這一步的執行時間為 o(lgn)。

綜上,該演算法的執行時間為 o(nlgn) + n⋅o(lgn) = o(nlgn)

演算法導論 練習2 3

2.3 1 3 41 52 26 38 57 9 49 3 41 26 52 38 57 9 49 3 26 41 52 9 38 49 57 3 9 26 38 41 49 52 57 2.3 2 def meger a,p,q,r param a 原陣列 param l 左陣列 param r ...

《演算法導論》2 1練習答案

2.1 1應該不用寫了 2.1 2重寫過程inertion sort,使之按公升序排序 偽 實現 inertion sort a for j 2 to a.length key a j insert a j to the sorted sequence a 1.j 1 i j 1 while i 0...

《演算法導論》2 2練習答案

捨棄它的低階項,並忽略前面的常數因子 n3 2.2 2考慮排序儲存在陣列a中的n個數 首先找出a中的最小元素並將其與a 1 中的元素進行交換。接著,找出a中的次最小元素並將其與a 2 中的元素進行交換。對a中前n 1個元素按該方式繼續。該演算法稱為選擇演算法,寫出其偽 該演算法維持的迴圈不變式是什麼...