第一次學習《演算法導論》,按照讀書的順序將一些心得記錄下來
#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 插入排序演算法,是乙個對少量元素進行排序的有效演算法.其偽 如圖 插入排序演算法在形式上類似於我們平時打牌時,邊抽牌邊整理撲克牌的順序,我們將新的牌與手中已經整理好順序的撲克牌進行比較,最終將抽到的牌...