讀書筆記 演算法導論

2022-09-18 20:03:12 字數 2360 閱讀 6306

第2章演算法入門

浮於表面不如深入其中,送給自己,自己是最大的敵人,那麼就盡最大努力去克服自己,沉思,冷靜,不浮躁!

勘誤:在演算法導論第9頁,扼要的扼

內容提要:

(1)偽**的表示方法

(2)插入排序演算法分析

(3)迴圈不變式

(4)演算法設計之分治法(divide-and-conquer)

(5)合併排序演算法分析

1.偽**的表示方法

①偽**與流程的程式語言類似;

②偽**可以用英語表示,當然中文也可以;

③不關心其他細節,比如異常處理等軟體工程需要關注的問題

約定:①必要的縮排;②控制語句:while、for、repet、if、then、else等等;③注釋表示有點特徵哈;④多重賦值;⑤變數的定義是不需要的,直接用即可;⑥陣列的訪問同c;⑦引數值傳遞;⑧布林運算的短路能力;⑨空指標為nil等等等等

2.插入排序演算法分析

輸入:n個數,可以表示為有序列;

輸出:同樣n個數,只是順序變了變為,其中a1』<=a2』<=…<=an』或者相反的結果。

另乙個術語:這些待排序的數字也叫關鍵字即key

例項:陣列a=

分析使用插入排序過程:

第1步:5,2,4,5,1,3

該步驟在第1個元素插入的情況下準備開始插第2個元素2

結果:2,5,4,5,1,3

第2步:2,5,4,5,1,3

該步驟需要插入元素4,我們從4之前的乙個元素5從5開始往前搜,第一次比較發現4比5小,繼續往前搜,發現4比2大則把4插入到2之後。

第3步:2,4,5,5,1,3

該步驟需要插入元素5,我們從5之前的乙個元素開始搜,第一次為5,發現不大於5(實際上是和5相等),則將5插入到5之後。

第4步:2,4,5,5,1,3

該步驟需要插入元素1,我們從1之前的乙個元素開始搜,第一次為5,pass,第二次為5,pass,第三次為4,pass,第四次為2還是pass,繼續往前走,發現前面沒人了,咋辦,直接插入空白之後。

第5步:1,2,4,5,5,3

好了,終於到最後一步了,大鬆一口氣哈。

好了該例項終於分析完畢了,我想現在對於插入排序的排序過程應該有了很深刻的了解了吧

小結:插入排序的實質就是,從第2個元素開始插入,然後乙個勁地以倒序的方式從前面的元素中搜尋不大於待插入的元素的元素(包括小於和等於啦),一旦找到,則將元素插入該元素之後,這樣不斷重複地插入就完成了插入排序的過程。

寫了這麼多,下面給出插入排序的**:

**:void insertsort( int* a, int n );

int main(intargc, char* ar**)

;printf("插入排序前:\n");

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

;int b[7]=;

int c[8]=;

printf("a為:");

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

{undefined

printf( "%d",a[i] );

printf("\nb為:");

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

{undefined

printf("%d",b[i]);

binadd(a,b,c,7);

printf("\n結果:");

for (inti=0; i< 8;i++)

{undefined

printf( "%d",c[i] );

return 0;

void binadd( int*a,int* b, int* c, intn )

{undefined

int i = n - 1;

//從最低位開始相加,也就是陣列的最高位

for ( ; i > 0; i-- )

{undefined

//判斷是否大於等於,需要進製

if ( a[i] + b[i] >= 2 )

{undefined

c[i+1] =a[i] + b[i] - 2;

//若需要進製,直接放到原陣列中去計算

a[i-1] += 1;

else

{undefined

c[i+1] =a[i] + b[i];

//最後一步,因為c比a和b都多出一位,所以直接將結果放置c[1],並將進製放置c[0]

if ( a[0] + b[0] >= 2 )

{undefined

c[1] = a[0]+b[0]-2;

c[0] = 1;

else

{undefined

c[1]= a[0]+b[0];

c[0] = 0;

演算法導論 讀書筆記2010 12 6

演算法就是一系列的計算步驟,用來將輸入資料轉換為輸出結果。資料結構師儲存和組織資料的一種方式,以便於對資料進行訪問和修改。插入排序演算法,對n個資料項的時間大約是c1n 2,其中c1是乙個不依賴於n的常量。亦即該演算法所需的時間大致與n 2成正比。合併排序演算法,排序n個資料項的時間大約是c2log...

《演算法導論》讀書筆記(一)

理解 輸入到輸出的計算過程稱為演算法。1.演算法描述 2.證明演算法正確性 3.分析演算法效率 兩個例子 1.插入排序 思想 從未排序的序列中取出乙個元素,將其插入到已排序序列的正確位置。實現 include include using namespace std int main for int ...

演算法導論讀書筆記(3)

當輸入規模大到使執行時間只和增長的量級有關時,就是在研究演算法的漸近效率。就是說,從極限角度看,我們只關心演算法執行時間如何隨著輸入規模的無限增長而增長。表示演算法的漸近執行時間的記號是用定義域為自然數集n 的函式來定義的。這些記號便於用來表示最壞情況執行時間 t n 對乙個給定的函式 g n 用 ...