使用哨兵的歸併排序(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個元素按該方式繼續。該演算法稱為選擇演算法,寫出其偽 該演算法維持的迴圈不變式是什麼...