本书内容全面,特色突出,注重基本算法和基本技能,培养和提高程序设计应用开发能力,利于学生领悟编程的真谛。全书内容主要包括程序与算法、程序设计语言、数据结构、查找与排序、穷举法、递归法、分治法、动态规划法、贪心法、回溯法以及附录。
本书适合作为高等院校计算机相关专业的教材或教学参考书,也可供从事计算机应用开发的各类技术人员应用参考,或用作全国计算机等级考试、软件技术资格与水平考试的培训资料。
本书内容全面,特色突出,注重基本算法和基本技能,培养和提高程序设计应用开发能力,利于学生领悟编程的真谛。全书内容主要包括程序与算法、程序设计语言、数据结构、查找与排序、穷举法、递归法、分治法、动态规划法、贪心法、回溯法以及附录。
本书适合作为高等院校的计算机相关专业的教材或教学参考书,也可供从事计算机应用开发的各类技术人员应用参考,或用作全国计算机等级考试、软件技术资格与水平考试的培训资料。
程序与算法作为程序设计语言学习的核心内容,本书的作者多年从事程序设计语言(如VB、C、C++、Python等)和算法教学,发现学生在语法的学习上花费太多的精力,往往还不能领会到编写程序的真谛所在。因此,本书不讨论程序设计语言的语法细节,注重基本算法、基本理论、基本技能的教学,在内容的选取上力图精简,主要培养学生掌握程序设计的基本方法及提高其应用开发能力的思想。
本书共分10章,主要内容包括程序与算法、程序设计语言、数据结构、查找与排序、穷举法、递归法、分治法、动态规划法、贪心法、回溯法以及附录。
本书由周元哲、刘伟、邓万宇编写,其中,刘伟编写分治法、动态规划法、贪心法、回溯法章节,邓万宇编写数据结构、查找与排序章节,其余章节由周元哲编写,全书由周元哲负责本书大纲拟订与统稿工作。
学习计算机程序设计的最好方法是实践。本书采用Python、VB.NET和C等高级程序设计语言进行讲解,所有程序都在VisualC6.0下调试运行通过。建议读者上机编写、运行和调试本书所给的例程。
西安邮电大学计算机学院的王玉清、孟伟君老师对本书的编写给予了大力的支持并提出了指导性意见,陈琳、郝羽等提出了很多宝贵的意见。清华大学出版社的张民老师对本教材的写作大纲、写作风格等提出了很多宝贵的意见。衷心感谢上述各位的支持和帮助。本书在写作过程中参阅了大量中外文的专著、教材、论文、报告及网上的资料,由于篇幅所限,未能一一列出。在此,向各位作者表示敬意和衷心的感谢。
本书可作为高等院校各专业学生学习程序设计和软件竞赛的教材或教学参考书,也可作为程序员和社会读者的自学辅助用书。由于作者水平有限,时间紧迫,本书难免有不足之处,我们诚恳期待读者的批评与指正,以使本书日臻完善。
作者
2016年2月
第1章程序与算法/1
1.1计算机基础知识/1
1.1.1硬件/1
1.1.2软件/2
1.2程序设计/3
1.2.1程序设计内容/3
1.2.2程序设计过程/3
1.3算法/3
1.3.1五个属性/5
1.3.2三个层次/5
1.4算法复杂性/6
1.4.1空间复杂度/6
1.4.2时间复杂度/7
1.4.3算法评价标准/7
1.4.4算法效率/8
1.5算法表示方式/10
1.5.1程序流程图/10
1.5.2NS图/10
1.5.3伪语言/11
1.6习题/11第2章程序设计语言/13
2.1程序设计语言演变历史/13
2.1.1机器语言/13
2.1.2汇编语言/13
2.1.3面向过程设计语言/13
2.1.4面向对象程序设计语言/14
2.1.5智能化语言/14
2.2结构化程序设计/14
2.2.1自顶向下/14
2.2.2逐步细化/14
2.2.3模块化设计/15
2.2.4结构化编码/15
2.3三种基本结构/15
2.3.1顺序结构/16
2.3.2选择结构/16
2.3.3循环结构/17
2.4高级程序设计语言的基本结构/18
2.4.1面向过程程序设计语言/18
2.4.2面向对象程序设计语言/19
2.5代码书写规则/20
2.5.1缩进/20
2.5.2逻辑行与物理行/20
2.5.3注释/21
2.5.4编码习惯/21
2.6程序调试/22
2.6.1调试策略/23
2.6.2三种调试工具/23
2.7选择语言的标准/25
2.7.1项目应用领域/25
2.7.2算法复杂度/25
2.7.3数据结构复杂性/25
2.7.4开发人员水平/26
2.8习题/26第3章数据结构/27
3.1概述/27
3.2线性表/27
3.2.1相关概念/27
3.2.2线性表存储/28
3.3栈/32
3.3.1相关概念/32
3.3.2栈的存储/32
3.4队列/34
3.4.1概念/34
3.4.2队列存储/34
3.5树/39
3.5.1相关概念/39
3.5.2二叉树的性质/40
3.5.3二叉树存储/41
3.5.4二叉树遍历/42
3.5.5二叉树创建/46
3.6图/46
3.6.1相关概念/46
3.6.2图的存储/47
3.6.3图的遍历/52
3.6.4最小生成树/55
3.6.5最短路径/57
3.7习题/61第4章查找与排序/63
4.1查找/63
4.1.1顺序查找/63
4.1.2折半查找/63
4.1.3分块查找/65
4.2排序/66
4.2.1插入类/67
4.2.2交换类/70
4.2.3选择类/72
4.2.4归并类/78
4.3排序法总结/79
4.3.1时间性能/79
4.3.2空间性能/79
4.3.3稳定性能/79
4.4习题/80第5章穷举法/82
5.1概述/82
5.2例题/82
5.2.1杨辉三角形/82
5.2.2螺旋数阵/84
5.2.3百钱买百鸡/84
5.2.4啤酒和饮料/86
5.3有意思的数/87
5.3.1素数/87
5.3.2孪生素数/88
5.3.3回文素数/89
5.3.4水仙花数/90
5.3.5北斗七星数/91
5.3.6完全数/92
5.3.7倒序数/93
5.4习题/93第6章递归法/94
6.1概述/94
6.1.1简介/94
6.1.2内存组织方式/95
6.1.3递归适用场合/95
6.2基本递归/96
6.2.1相关概念/96
6.2.2基本递归运行原理/97
6.3尾递归/98
6.3.1相关概念/98
6.3.2尾递归运行原理/98
6.4相似术语解析/99
6.4.1递归与循环/99
6.4.2迭代和递推/99
6.4.3迭代与遍历/100
6.4.4递归和递推/100
6.5例题/103
6.5.1最大公约数/103
6.5.2最近公共子结点/105
6.5.3汉诺塔问题/106
6.5.4平面划分/107
6.5.5切面条/109
6.5.6全排列问题/110
6.5.7整数划分问题/112
6.6习题/113第7章分治法/114
7.1概述/114
7.2从求数组最值谈起/114
7.3算法框架/120
7.4查找与排序中的分治法/122
7.4.1二分查找算法/122
7.4.2快速排序算法/123
7.5乘法中的分治法/126
7.5.1大整数乘法/126
7.5.2Strassen矩阵乘法/128
7.6棋盘覆盖问题/132
7.7习题/135第8章动态规划法/136
8.1概述/136
8.2矩阵连乘积问题/136
8.3字符串相似度问题/144
8.3.1最长公共子序列问题/144
8.3.2编辑距离问题/149
8.4数字三角形问题/151
8.501背包问题/152
8.6习题/154第9章贪心法/156
9.1概述/156
9.2活动安排问题/157
9.3贪心算法和动态规划算法关系/159
9.4最优装载问题/161
9.5最优分解问题/163
9.6单源最短路径问题/164
9.7习题/168第10章回溯法/170
10.1概述/170
10.2从01背包问题看回溯法的算法框架/170
10.3装载问题/175
10.4批处理作业调度问题/177
10.5n皇后问题/179
10.6最小重量机器设计问题/181
10.7工作分配问题/182
10.8习题/183附录各类软件竞赛/184
A.1计算机认证考试/184
A.2全国计算机等级考试/184
A.3计算机技术与软件专业技术资格(水平)考试/185
A.4ACM国际大学生程序设计竞赛/185
A.5蓝桥杯/185
A.6全国Java程序设计大赛/186参考文献/187