演算法導論閱讀筆記

2022-09-06 10:21:19 字數 2581 閱讀 1236

第二章:演算法入門

本章通過介紹插入排序和歸併排序兩種常見的排序演算法來說明演算法的過程及演算法分析,在介紹歸併排序演算法過程中引入了分治(divide-and-conquer)演算法策略。

1、插入排序

輸入:n個數(a1,a2,a3,...,an)

輸出:輸入序列的乙個排列(a1',a2',a3',...an')使得(a1'≤a2'≤a3'≤...≤an')。

插入排序的基本思想是:將第i個元素插入到前面i-1個已經有序的元素中。具體實現是從第2個元素開始(因為1個元素是有序的),將第2個元素插入到前面的1個元素中,構成兩個有序的序列,然後從第3個元素開始,迴圈操作,直到把第n元素插入到前面n-1個元素中,最終使得n個元素是有序的。該演算法設計的方法是增量方法。書中給出了插入排序的為**,並採用迴圈不變式證明演算法的正確性。我採用c語言實插入排序,完整程式如下:

1 void insert_sort(int *datas,int length)

2 11 //陣列下標是從0開始的,從第二個元素(對應下標1)開始向前插入

12 for(j=1;j=0 && datas[i] > key)

18

24 datas[i+1] = key; //最終確定待插入元素的位置

25 }

26 }

插入排序演算法的分析

演算法分析是對乙個演算法所需的資源進行**,資源是指希望測度的計算時間。插入排序過程的時間與輸入相關的。插入排序的最好情況是輸入陣列開始時候就是滿足要求的排好序的,時間代價為θ(n),最壞情況下,輸入陣列是按逆序排序的,時間代價為θ(n^2)。

2、歸併排序

歸併排序採用了演算法設計中的分治法,分治法的思想是將原問題分解成n個規模較小而結構與原問題相似的小問題,遞迴的解決這些子問題,然後再去合併其結果,得到原問題的解。分治模式在每一層遞迴上有三個步驟:

分解(divide):將原問題分解成一系列子問題。

解決(conquer):遞迴地解答各子問題,若子問題足夠小,則直接求解。

合併(combine):將子問題的結果合併成原問題的解。

歸併排序(merge sort)演算法按照分治模式,操作如下:

分解:將n個元素分解成各含n/2個元素的子串行

解決:用合併排序法對兩個序列遞迴地排序

合併:合併兩個已排序的子串行以得到排序結果

在對子序列排序時,長度為1時遞迴結束,單個元素被視為已排序好的。歸併排序的關鍵步驟在於合併步驟中的合併兩個已經有序的子串行,引入了乙個輔助過程,merge(a,p,q,r),將已經有序的子陣列a[p...q]和a[q+1...r]合併成為有序的a[p...r]。書中給出了採用哨兵實現merge的偽**,課後習題要求不使用哨兵實現merge過程。在這個兩種方法中都需要引入額外的輔助空間,用來存放即將合併的有序子陣列,總的空間大小為n。現在用c語言完整實現這兩種方法,程式如下:

1 //採用哨兵實現merge

2 #define maxlimit 65535

3 void merge(int *datas,int p,int q,int r)

4 11 }

歸併排序演算法分析:

演算法中含有對其自身的遞迴呼叫,其執行時間可以用乙個遞迴方程(或遞迴式)來表示。歸併排序演算法分析採用遞迴樹進行,遞迴樹的層數為lgn+1,每一層的時間代價是cn,整棵樹的代價是cn(lgn+1)=cnlgn+cn,忽略低階和常量c,得到結果為θ(nlg n)。

3、課後習題

有地道題目比較有意思,認真做了做,題目如下:

方法1:要求執行時間為θ(nlgn),對於集合s中任意乙個整數a,設b=x-a,採用二分查詢演算法在s集合中查詢b是否存在,如果b存在說明集合s中存在兩個整數其和等於x。而二分查詢算起的前提是集合s是有序的,演算法時間為θ(lgn),因此先需要採用一種時間最多為θ(nlgn)的演算法對集合s進行排序。可以採用歸併排序演算法,這樣總的執行時間為θ(nlgn),滿足題目給定的條件。

具體實現步驟:

1、採用歸併排序演算法對集合s進行排序

2、對集合s中任意整數a,b=x-a,採用二分查詢演算法b是否在集合s中,若在則集合s中存在兩個整數其和等於x,如果遍歷了s中所有的元素,沒能找到b,即集合s中不存在兩個整數其和等於x。

方法2:網上課後習題答案上面給的一種方法,具體思想如下:

1、對集合s進行排序,可以採用歸併排序演算法

2、對s中每乙個元素a,將b=x-a構造乙個新的集合s',並對s』進行排序

3、去除s和s'中重複的資料

4、將s和s'按照大小進行歸併,組成新的集合t,若干t中有兩隊及以上兩個連續相等資料,說明集合s中存在兩個整數其和等於x。

例如:s=,設x=11,執行過程如下:

對s進行排序,s=。

s'=,排序後s』=。

去除s和s'中重複的資料後s=,s'=

歸納s和s'組成新集合t=,可以看出集合t中存在兩對連續相等資料4和7,二者存在集合s中,滿足4+7=11。

**《演算法導論》讀書筆記(一) - alantu - (cnblogs.com)

演算法導論閱讀筆記

優先順序佇列 1 概述 佇列是一種滿足先進先出 fifo 的資料結構,資料從佇列頭部取出,新的資料從佇列尾部插入,資料之間是平等的,不存在優先順序的。這個就類似於普通老百姓到火車站排隊買票,先來的先買票,每個人之間是平等的,不存在優先的權利,整個過程是固定不變的。而優先順序佇列可以理解為在佇列的基礎...

對於演算法導論閱讀的感想

實際上就是暴力排序,乙個是從多變少,乙個是從少變多。選擇排序是對新陣列成員進行選擇而無需照顧源陣列,而氣泡排序則是對源陣列進行選擇而無需照顧生成陣列。時間複雜度 o n 2 乍一看,感覺和冒泡是神似的。因為他們都是通過對源陣列進行選擇而無需照顧生成陣列的。但是不同的地方就是堆排序有乙個生成堆的提前過...

《演算法導論》筆記彙總

列表裡沒有的,或者是純屬理論,不適合寫,比如第1 5章 或者是我也不怎麼明白的,比如斐波那契堆中抽取最小結點的平攤代價分析 還有沒看的,比如數論和np完全性等。陸續看了四個月,有些理解的還不是很深,筆記彙總到這裡。如果有問題,可以郵件交流。第六章 堆排序 堆排序 第七章 快速排序 四種快速排序 快速...