1.插入排序
insertion-sort(a)
forj=2 to a.
length
key=a[j]
i=j-1
while(i>0&&a[i]>key)
a[i+1]=a[i];
i=i-1
a[i+1]=key;
每次取前j個數字排序,將第j個數字插入到1到j-1個數字中。
採用迴圈不變式幫助理解演算法的正確性。迴圈不變式有三條性質:
(1)初始化:迴圈第一次迭代之前,它為真。
(2)保持:如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。
(3)終止:在迴圈終止時,不變式為我們提供了乙個有用的性質,該性質證明演算法是正確的。
插入排序的迴圈不變式是,a[1..j-1]就是原來該位置內的元素,但已經按序排列。比較容易看出滿足上述性質。因此演算法正確。
2.演算法分析
通常採用計算時間進行演算法的度量,採用單處理器計算模型ram作為實現技術,在該模型中,指令一條接一條執行,沒有併發操作,每條指令所需時間為常量,常見指令包括基本算術指令,資料移動指令,控制指令。
一般來說,演算法需要的時間與輸入的規模同步增長,所以通常把乙個程式的執行時間描述成其輸入規模的函式。輸入規模的概念依賴於研究的問題,但對許多問題,最自然的量度就是輸入中的項數。執行時間是指執行的基本運算元或步數。
插入演算法分析:
總時間為代價與次數乘積之和,最好情況時,陣列已排好序,出現最佳執行時間為:
t(n)=c1n+c2(n-1)+c3(n-1)+c4(n-1)+c7(n-1)=an+b
最壞情況時,反向排序,此時總時間為n的2次函式。
一般會考慮最壞情況執行時間,因為這樣可得知任何輸入執行時間的上界,而且很多演算法,最壞情況經常出現,並且平均情況往往和最壞情況大致一樣差。比如插入排序,平均執行時間也是輸入規模的二次函式。
更簡化的,我們真正感興趣的是執行時間的增長率或者增長量級,比如插入排序中的an2,當n很大時,低價可以忽略。記做θ(n^2)。
3.分治法
將原問題分解為幾個規模小但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來建立原問題的解。分治模式在每層遞迴時都有三個步驟:
(1)分解原問題為若干個子問題,都是原問題的規模較小的例項。
(2)解決這些子問題,遞迴求解各個子問題,當子問題足夠小時,直接求解。
(3)合併子問題的解成原問題的解。
歸併排序演算法完全遵循這種模式:
(1)分解待排序的n個元素序列成各具n/2個元素的兩個子串行。
(2)使用歸併排序遞迴排序兩個子串行,當序列長度位1時,遞迴開始回公升。
(3)合併兩個已排序的序列形成已排序的長序列。
template
void merge(t a, int low, int middle, int high)
for (int i = 0; i < n2; i++)
left[n1] = 99999;
right[n2] = 99999;
int i = 0, j = 0;
for (int k = low; k <= high; k++)
else
}}template
void mergesort(t a, int low, int high)
}
演算法導論 隨機演算法
一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...
《演算法導論》 演算法導論2 2 1插入排序
2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...
演算法導論目錄
出版者的話 專家指導委員會 譯者序前言 第一部分 基礎知識 引言 第1章 演算法在計算中的作用 1.1 演算法 1.2 作為一種技術的演算法 第2章 演算法入門 2.1 插入排序 2.2 演算法分析 2.3 演算法設計 2.3.1 分治法 2.3.2 分治法分析 第3章 函式的增長 3.1 漸近記號...