《算法導論》網易公開課地址
性能的重要
可拓展性,安全等似乎比性能更爲重要,但性能像底部的貨幣,程序以性能爲基礎,沒有性能就沒有一切。特別當你研發新產品時,性能更爲重要
插入法排序
sorts A[1~n]
pseudocode(僞代碼)
for j<-2 to n
do key <- A[j]
i<-j-1
while i>0 and A[i]>key
do A[i+1]<-A[i]
i<-i-1
A[i+1]<-key
注意這裏的數組下標是從1開始
下面用c++實現
#include<iostream>
using namespace std;
void main()
{
int A[8]={8,3,5,9,6,5,2,0},i,j,key;
for(j=1;j<8;j++)
{
key=A[j];
i=j-1;
while(i>=0&&A[i]>key)
{
A[i+1]=A[i];
i--;
}
A[i+1]=key;
}
cout<<"the consequence is "<<endl;
for(i=0;i<8;i++)
{
cout<<A[i]<<endl;
}
}
因爲c/c++中數組下標從0開始,所以有小改動。
插入法什麼意思?
首先選擇一個值爲key值(從第二個數起選擇),然後向前去尋找它應該在的位置。
當A[i]是比key大(從小到大排序),說明key至少在A[i]前面,此時把A[i]往後挪,不斷重複(第一次挪會導致key原本的位置被佔)。當發現A[i]小於等於key,就把key放到A[i]的後一個。
拿一組數據:8,2,4,9,3
首先選取2爲key,往前比較,發現8比2大,又是第一個位置,所以:
2,8,4,9,3
接着4爲key值,往前比較,發現8比4大,2又小於4,所以
2,4,8,9,3
9爲key值,8不比9大,所以9在原位
2,4,8,9,3
3爲key值,9比3大,所以
2,4,8,9,9
3繼續往前比,8比3大,所以
2,4,8,8,9
繼續
2,3,4,8,9
完成,相當於3直接插入2與4之間,在尋找位置插入過程中key可能在原數組中是沒有的。
可以發現,新選一個key時,這個數以前的數組是已經排好序的
running time
- 輸入(input),如果輸入的數越接近排序好的結果,算法要做的越少
- 數據規模(input size)
- 上限(upper bounds)知道最少會運行的時間用處不大
- worst case(usually),只關注最大值(max time)
- average case (sometimes),期望時間(expected time)
- best case(bogus),不可能發生
插入法運算時間
- depends on computer
- relative speed 不同算法在同一臺機器的運算快慢
- absolute speed
asymptotic analysis 漸近分析
- 忽略依賴機器的常量
- 關注運行時間的增長
asymptomatic notation 漸近符號
歸併排序(merge sort)
sort A[1~n]
1. if n=1 done 如果只有一個數,肯定已經排好序
2. 遞歸地(recursively)排序A[1~
3. 歸併(merge)兩個表
歸併merge
現在有兩張表(list):
20,13,7,2
12,11,9,1
先比較兩個表各自最小的數,把1拿出來,於是
20,13,7,2
12,11,9
接着比較剩餘部分,兩個表中最小的是2,再把2拿出來,於是
20,13,7
12,11,9
而結果部分已經有
1,2
重複,繼續比較兩個表中各自最小的數把小的那個拿出來
歸併時間
總的歸併排序時間