《演算法導論》第2章 演算法基礎 個人筆記

2021-07-31 11:05:14 字數 1318 閱讀 5871

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...