本書系統(tǒng)介紹程序設(shè)計(jì)中各種常用的基礎(chǔ)算法及典型案例,包括排序算法、遞歸算法、數(shù)論基礎(chǔ)、組合數(shù)學(xué)基礎(chǔ)、貪心算法、分治算法、動(dòng)態(tài)規(guī)劃算法和回溯算法等內(nèi)容。
全書以圖文并茂的方式講解各基礎(chǔ)算法的分析過程,側(cè)重基礎(chǔ)算法的深入理解與實(shí)踐,配有大量圖表輔助算法的分析過程,適用于有一定程序設(shè)計(jì)基礎(chǔ)、尚未學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)且對算法分析與設(shè)計(jì)感興趣的算法初學(xué)者。
本書各章均配有典型案例和大量圖表,既便于教師課堂講授,也適合讀者自學(xué),可作為高等院校程序設(shè)計(jì)基礎(chǔ)課程的延伸和算法分析與設(shè)計(jì)課程的入門教材,也可供程序設(shè)計(jì)競賽初學(xué)者參考。
本書系統(tǒng)介紹程序設(shè)計(jì)中各種常用的基礎(chǔ)算法及典型案例,包括排序算法、遞歸算法、數(shù)論基礎(chǔ)、組合數(shù)學(xué)基礎(chǔ)、貪心算法、分治算法、動(dòng)態(tài)規(guī)劃算法和回溯算法等內(nèi)容。
全書以圖文并茂的方式講解各基礎(chǔ)算法的分析過程,側(cè)重于基礎(chǔ)算法的深入理解與實(shí)踐,配有大量圖表輔助算法的分析過程,適用于有一定程序設(shè)計(jì)基礎(chǔ)、尚未學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)且對算法分析與設(shè)計(jì)感興趣的算法初學(xué)者。
本書配有典型案例和大量圖表,既便于教師課堂講授,也適合讀者自學(xué),可作為高等院校程序設(shè)計(jì)基礎(chǔ)課程的延伸和算法分析與設(shè)計(jì)課程的入門教材,也可供程序設(shè)計(jì)競賽初學(xué)者參考。
算法分析與設(shè)計(jì)的課程目標(biāo)是培養(yǎng)運(yùn)用數(shù)學(xué)思維和計(jì)算思維分析問題與應(yīng)用所學(xué)專業(yè)知識(shí)解決問題的能力。通過對基礎(chǔ)理論和典型案例的學(xué)習(xí),讀者能夠掌握算法設(shè)計(jì)的方法和技巧,為后續(xù)數(shù)據(jù)結(jié)構(gòu)等相關(guān)課程的學(xué)習(xí)及參加各類學(xué)科競賽奠定基礎(chǔ)。
在學(xué)習(xí)本書內(nèi)容之前,讀者應(yīng)具備一定的編程基礎(chǔ),能夠熟練運(yùn)用C、C 、Java、Python等至少一門編程語言,無須具備數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)。本書是程序設(shè)計(jì)基礎(chǔ)和算法分析與設(shè)計(jì)之間的過渡,為剛剛學(xué)習(xí)過程序設(shè)計(jì)基礎(chǔ)的算法入門者量身定制。
本書的主要特點(diǎn)是算法知識(shí)基礎(chǔ)化和分析過程圖表化,只要求讀者具備程序設(shè)計(jì)基礎(chǔ)知識(shí),重在興趣與入門,不涉及艱深晦澀的內(nèi)容。以圖表方式給出算法的動(dòng)態(tài)分析過程,使讀者能夠真正理解和掌握算法的本質(zhì),能夠根據(jù)實(shí)際工作設(shè)計(jì)和優(yōu)化算法。
全書由9章構(gòu)成,各章具體內(nèi)容如下。
第1章: 環(huán)境搭建。主要介紹Windows操作系統(tǒng)下學(xué)習(xí)環(huán)境的搭建及注意事項(xiàng)。
第2章: 排序算法。介紹冒泡排序、選擇排序、插入排序和計(jì)數(shù)排序等常見排序算法。
第3章: 遞歸算法。分析遞歸算法的本質(zhì)特征,并通過遞歸算法求解漢諾塔、全排列、因數(shù)分解和分形圖形問題。
第4章: 數(shù)論基礎(chǔ)。介紹數(shù)論的基本概念及性質(zhì),分析素?cái)?shù)和同余兩類典型的數(shù)論基礎(chǔ)問題。
第5章: 組合數(shù)學(xué)基礎(chǔ)。介紹組合數(shù)學(xué)的基本概念和性質(zhì),分析排列和組合生成的典型算法。
第6章: 貪心算法。介紹結(jié)構(gòu)體類型,分析活動(dòng)時(shí)間安排、最優(yōu)裝載、可切割背包、刪數(shù)問題及操作系統(tǒng)內(nèi)存分配等典型貪心算法案例。
第7章: 分治算法。介紹分治算法的基本思想,應(yīng)用分治思想求解快速排序、歸并排序、二分查找、循環(huán)賽及大整數(shù)乘法問題。
第8章: 動(dòng)態(tài)規(guī)劃算法。介紹動(dòng)態(tài)規(guī)劃算法的特點(diǎn)和解題過程,利用動(dòng)態(tài)規(guī)劃算法求解數(shù)字三角形、最長公共子序列、編輯距離、01背包問題及石子合并問題。
第9章: 回溯算法。介紹回溯算法的解題思路,通過圖表詳細(xì)分析八皇后問題、子集和問題、01背包問題、裝載問題及任務(wù)分配問題的探索和回溯過程。
算法分析與設(shè)計(jì)的核心是體會(huì)和實(shí)踐,講授是基礎(chǔ),實(shí)踐是關(guān)鍵。本書提供各典型案例相關(guān)的全部源代碼(C和C 版本,在Visual C 2010、Visual C 2019及Code∷Blocks中調(diào)試通過)。
本書由吉林師范大學(xué)教材出版基金資助,是授課教師多年教學(xué)經(jīng)驗(yàn)的總結(jié),但由于編者水平所限,書中難免存在遺漏和不足之處,敬請讀者批評指正,在此表示誠摯謝意。
編者2025年1月
第1章環(huán)境搭建1
1.1Microsoft Visual C 2010學(xué)習(xí)版的使用1
1.1.1Visual C 2010學(xué)習(xí)版的安裝2
1.1.2創(chuàng)建、編輯、編譯和運(yùn)行項(xiàng)目4
1.1.3為什么缺少很多選項(xiàng)8
1.1.4為什么一閃而過9
1.1.5其他配置選項(xiàng)11
1.2Code∷Blocks的使用14
1.2.1安裝Code∷Blocks14
1.2.2創(chuàng)建項(xiàng)目和編輯源代碼16
1.2.3調(diào)試20
第2章排序算法23
2.1冒泡排序23
2.1.1冒泡排序的基本思想23
2.1.2冒泡排序過程分析24
2.1.3冒泡排序代碼分析26
2.2選擇排序28
2.2.1選擇排序的基本思想28
2.2.2選擇排序過程分析29
2.2.3選擇排序代碼分析30
2.3插入排序31
2.3.1插入排序的基本思想31
2.3.2插入排序過程分析32
2.3.3插入排序代碼分析33
2.4計(jì)數(shù)排序35
2.4.1計(jì)數(shù)排序的基本思想35
2.4.2計(jì)數(shù)排序過程分析36
2.4.3計(jì)數(shù)排序代碼分析38
2.4.4統(tǒng)計(jì)句子中字母出現(xiàn)的次數(shù)40
算法設(shè)計(jì)練習(xí)42第3章遞歸算法43
3.1漢諾塔問題43
3.1.1漢諾塔問題解題思路分析43
3.1.2漢諾塔問題代碼分析45
3.2全排列問題46
3.2.1無重復(fù)元素的全排列47
3.2.2有重復(fù)元素的全排列49
3.3因數(shù)分解問題52
3.3.1因子遞增方式遞歸求解53
3.3.2子問題分解方式遞歸求解54
3.3.3因數(shù)分解問題代碼分析54
3.4分形圖形56
3.4.1盒分形思路分析56
3.4.2盒分形代碼分析57
算法設(shè)計(jì)練習(xí)59
第4章數(shù)論基礎(chǔ)60
4.1余數(shù)和最大公約數(shù)60
4.1.1余數(shù)60
4.1.2最大公約數(shù)63
4.1.3歐幾里得算法63
4.2素?cái)?shù)問題65
4.2.1素?cái)?shù)的概念65
4.2.2素?cái)?shù)相關(guān)的定理65
4.2.3篩選法求素?cái)?shù)66
4.3同余問題74
4.3.1同余及其性質(zhì)74
4.3.2線性同余75
算法設(shè)計(jì)練習(xí)92
第5章組合數(shù)學(xué)基礎(chǔ)94
5.1排列生成算法94
5.1.1序數(shù)生成法95
5.1.2字典序生成法99
5.1.3火星人問題100
5.2組合生成算法102
5.2.1基于字典序的組合生成算法103
5.2.2基于格雷碼的組合生成算法107
算法設(shè)計(jì)練習(xí)116
第6章貪心算法117
6.1結(jié)構(gòu)體117
6.2貪心算法概述119
6.3活動(dòng)時(shí)間安排120
6.3.1活動(dòng)安排過程分析121
6.3.2活動(dòng)安排代碼分析123
6.4最優(yōu)裝載問題125
6.4.1最優(yōu)裝載問題過程分析125
6.4.2最優(yōu)裝載問題代碼分析126
6.5可切割背包問題128
6.5.1可切割背包問題分析128
6.5.2可切割背包代碼分析130
6.6刪數(shù)問題132
6.7操作系統(tǒng)內(nèi)存分配134
6.7.1First Fit內(nèi)存分配136
6.7.2Best Fit內(nèi)存分配137
6.7.3Worst Fit內(nèi)存分配139
算法設(shè)計(jì)練習(xí)141
第7章分治算法142
7.1快速排序143
7.1.1快速排序過程分析143
7.1.2快速排序代碼分析144
7.2歸并排序146
7.2.1歸并排序過程分析146
7.2.2歸并排序代碼分析147
7.3二分查找149
7.3.1二分查找過程分析149
7.3.2二分查找代碼分析150
7.4循環(huán)賽152
7.4.12k循環(huán)賽日程表152
7.4.2奇偶循環(huán)賽日程表155
7.5大整數(shù)乘法160
7.5.1大整數(shù)乘法過程分析160
7.5.2大整數(shù)乘法代碼分析161
算法設(shè)計(jì)練習(xí)165第8章動(dòng)態(tài)規(guī)劃算法166
8.1數(shù)字三角形166
8.1.1使用樸素遞歸求解數(shù)字三角形問題167
8.1.2使用動(dòng)態(tài)規(guī)劃算法求解數(shù)字三角形問題168
8.2最長公共子序列175
8.2.1最長公共子序列問題過程分析175
8.2.2最長公共子序列問題代碼分析176
8.3編輯距離180
8.3.1編輯距離的正向生成180
8.3.2操作序列的逆向回溯182
8.401背包問題(一)186
8.4.101背包問題過程分析186
8.4.201背包問題代碼分析187
8.5石子合并191
8.5.1石子合并問題過程分析192
8.5.2石子合并問題代碼分析193
算法設(shè)計(jì)練習(xí)201
第9章回溯算法202
9.1八皇后問題202
9.1.1八皇后問題過程分析202
9.1.2八皇后問題代碼分析204
9.2子集和問題207
9.2.1子集和問題過程分析208
9.2.2子集和問題代碼分析209
9.301背包問題(二)211
9.3.101背包問題過程分析211
9.3.201背包問題代碼分析213
9.4裝載問題216
9.4.1裝載問題過程分析216
9.4.2裝載問題代碼分析216
9.5任務(wù)分配問題 219
9.5.1任務(wù)分配問題過程分析219
9.5.2任務(wù)分配問題代碼分析219
算法設(shè)計(jì)練習(xí)222
參考文獻(xiàn)224