insertion-sort(a)
for j = 2 to a.length
key = a[j]
i = j - 1
while i > 0
anda[i] > key
a[i+1] = a[i]
i--a[i+1] = key
在insertion-sort中,若輸入陣列已排好序,則出現最佳情況,t(
n)=θ
(n)
若輸入陣列已反向排序,則導致最壞情況,t(
n)=θ
(n2)
分治模式在每層遞迴時都有三個步驟:
歸併演算法完全遵循分治模式:
merge(a, p, q, r)
n1 = q - p + 1
n2 = r - q
let l[1..n1+1] and r[1..n2+1] be new arrays
for i = 1
to n1
l[i] = a[p + i - 1]
l[n1 + 1] = max
for j = 1
to n2
l[j] = a[q + j]
r[n2 + 1] = max
i = 1
j = 1
for k = p to r
if l[i] <=r[j]
a[k] = l[i]
i++else
a[k] = r[j]
j++
merge-sort(a, p r)
if p < r
q = (p + r) / 2
merge-sort(a, p q)
merge-sort(a, q + 1, r)
merge(a, p, q, r)
複雜度分析:
每乙個merge的複雜度是(r-p+1),即輸入規模,用結果遞迴樹表示
層具有2i
個節點,每個節點貢獻代價c(
n/2i
) ,所以第
i 層具有總代價2i
∗c(n
/2i)
=cn,遞迴樹總層數為lgn
+1。故總代價為cn
(lgn+
1)=c
nlgn+
cn,忽略低階項和常量c便給出了期望的結果θ(
nlgn)
演算法導論第2章 演算法基礎
2.1 插入排序 includeusing namespace std void insertion sort int a,int n 宣告 void print int a,int n void insertion sort int a,int n a i 1 key void print int...
《演算法導論》第2章 演算法基礎
學習內容 演算法 尤其是遞迴演算法 複雜度的計算方法 證明演算法正確性的三個步驟 雖然我沒有怎麼弄清楚 幾個排序演算法的實現與比較 插入排序 include using namespace std int a 6 int main a i 1 key 此時a i 為第乙個不比key大的元素 for ...
《演算法導論》筆記 第2章
本章出現了全書第乙個演算法 插入排序。插入排序並不是最直觀的排序演算法,拿它做第乙個講解應該有其他的理由。通過插入排序的講解,偽 約定 迴圈不變式 演算法分析等最基礎的知識被帶了出來。此後又講了第二個演算法 合併排序,並引出了演算法設計中的兩種常見型別 增量法 incremental 和分治法 di...