演算法導論學習筆記 (1)

2021-06-27 18:02:59 字數 1074 閱讀 4922

乙個acm若菜,趁著acm淡季,開始學習演算法導論了,經過一年的acm學習,逐漸的發現,學東西,深入才是王道,以前學習乙個演算法,總是看懂了就開始做題,到後來才發現很多題目,會演算法,卻不知道是用這個演算法,這就是演算法理解的不到位的後果,從今天開始,定下目標:

1.深入系統的學習演算法,

2.學會紙上寫偽**,每章的**自己先在紙上寫一遍,

3.每節的學習筆記和演算法都要寫在部落格上。

現在,先寫寫書上的第乙個演算法,插入排序。

演算法思想:對於乙個陣列a,如果a[0~j-1]已經為有序序列,那麼對於第j位來說,只需要依次更a[j-1~0]比較,如果a[j]更小,就把當前比較的數往後挪一位,最後把a[j]放入空位中,下面為**。

現在給出下面**的正確性證明:

1. 當j = 1的時候,a[0~j-1]的數只有a[0], 此時顯然a[0]是乙個已排序的序列,在a[1]與a[0]進行比較之後,a[0~1]變成了乙個有序序列。

2. 假設滿足a[0~j-1]為有序序列,那麼當迭代j的時候, a[j]會與a[j-1 ~ 0]依次比較並把比a[j]小的依次往後挪,最後把a[j]放入對應位置,於是a[0~j] 變又成了乙個有序序列, 然後j+1,進行下一次迭代。

3. 當迴圈跳出的時候,因為每次j都會+1,於是j = n, 此時由2可得出,a[0~n-1]為有序序列,並且a[0~n-1]為完整的序列,於是演算法正確。

//insertion_sort

#include using namespace std;

void insertion_sort(int* a, int n)

a[i+1] = key;

}}void print(int* a, int n)

cout << endl;

}int main()

;

cout << "before sorted: ";

print(a, 10);

insertion_sort(a, 10);

cout << "after sorted: ";

print(a, 10);

return 0;

}

《演算法導論》學習筆記(1)

時間複雜度 time complexity 0,1,1,2,3,5,8,13,21,34 數列中每個數都是其兩個直接前項的和。f nf fn 的生成規則 f n left f f n 1 1 n 1 0 n 0 end right.fn fn 1 fn 1 10 n 1n 1n 0 fibonacc...

演算法導論筆記 1

略過 2.1 插入排序這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法 演算法的複雜度通常有以下幾種情況 2.3 設計演算...

演算法導論學習筆記 1 基礎排序演算法

最近從頭開始學習演算法導論,作為乙個非計算機專業的學生,我的目的也就是為了找工作的時候能多點籌碼 但是學習過程中還是有不少收穫的,順便也能練習下python程式設計水平,因此記錄下學習內容 第一章是演算法基礎,這裡介紹了2種排序方法 插入排序和歸併排序 例子還算比較淺顯易懂。對於插入排序,可以用乙個...