《演算法導論》讀書筆記(一) 插入排序與迴圈不變式

2021-06-18 04:38:49 字數 1557 閱讀 4926

第一次學習《演算法導論》,按照讀書的順序將一些心得記錄下來

#include using namespace std;

void insert_sort(int a, int length);

int main()

; insert_sort(a, n);

for(int i = 0; i < n; i++)

cout << endl;

return 0;

}void insert_sort(int a, int length)

a[j + 1] = temp;

}}

初始化:迴圈的第一次迭代之前,它為真。

保持:如果迴圈的某次迭代之前為真,那麼下次迭代之前仍為真。

終止:在迴圈終止時,不變式為我們提供乙個有用的性質,該性質有助於證明演算法是正確的。

初始化:當迴圈開始之前(i=1的時候),有序組只有一項a[0],所以,它為真。

終止:外面的for迴圈的終止條件是i=length即下標超過陣列長度。每次迴圈迭代i增加1,所以此時i=length,在迴圈不變式中將i用length代替,有子陣列a[0..length-1]由原來在a[0..length-1]中的元素組成,但已經按序排列。因為子陣列a[0..length-1]就是整個陣列,所以整個陣列已經排序,演算法正確。

最關心的:計算時間。

所用模型:ram,單核,順序執行,無併發

資料型別:整型,浮點,不太關心精度

灰色區域:未列出指令,例如指數運算等。

記憶體層級:一般不關心,但是特定演算法影響重大。大多數情況不考慮也能很好的**效能。

數學工具:組合數學、概率論、代數技巧等

描述方法:輸入規模的函式

輸入規模:每種演算法的輸入規模的描述不盡相同,需要指定

插入排序的執行時間

insert_sort

代價次數

for(int i = 1; i < length; i++)c1n

int temp = a[i];

c2n-1

int j = i - 1;

c3n-1

while(j > -1 && a[j] > temp)

c4t2+...+tn

a[j + 1] = a[j];

c5t2-1+...tn-1

j--;

c6t2-1+...tn-1

a[j + 1] = temp;

c7n-1

對於插入排序,它的執行時間就是:代價*次數的求和

從次數中可以看到,即使是確定了輸入規模,次數也可能依據輸入的不同而有所變化。

對於插入排序,如果輸入已經排好序,則所需時間是n的線性函式,即tn=an+b

如果輸入是完全反序的,則所需時間是n的二次函式,即tn=an^2+bn+c

為什麼分析最壞情況:

1.最壞情況給出了上界。

2.某些演算法,最壞情況經常出現。

3.平均情況往往與最壞情況一樣糟。

只考慮公式中最重要的項,保留高階,忽略低階,忽略項係數。

如此,記插入演算法的增長量級是:θ(n^2)

演算法導論讀書筆記 插入排序

一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 將新元素插入到該位...

演算法 一 插入排序

插入排序演算法類似於玩撲克時抓牌的過程,玩家每拿到一張牌都要插入到手中已有的牌裡,使之從小到大排好序。撲克牌的插入排序 也許你沒有意識到,但其實你的思考過程是這樣的 現在抓到一張7,把它和手裡的牌從右到左依次比較,7比10小,應該再往左插,7比5大,好,就插這裡。為什麼比較了10和5就可以確定7的位...

排序演算法(一) 插入排序

首先,對排序演算法 輸入 n 個數 輸出 序列的乙個排序,使得a1 a2 an 待排序的數為key 插入排序演算法,是乙個對少量元素進行排序的有效演算法.其偽 如圖 插入排序演算法在形式上類似於我們平時打牌時,邊抽牌邊整理撲克牌的順序,我們將新的牌與手中已經整理好順序的撲克牌進行比較,最終將抽到的牌...