第1章 集腋成裘——渐增型算法 1
1.1 算法设计与分析 1
1.2 插入排序算法 4
1.2.1 算法描述与分析 4
1.2.2 程序实现 6
1.2.3 应用——赢得舞伴 30
1.3 两个有序序列的合并算法 32
1.3.1 算法描述与分析 32
1.3.2 程序实现 34
1.4 序列的划分 45
1.4.1 算法描述与分析 45
1.4.2 程序实现 46
1.5 小结 52
第2章 化整为零——分治算法 53
2.1 Hanoi塔问题与递归算法 53
2.1.1 算法的描述与分析 53
2.1.2 程序实现 56
2.1.3 应用——新Hanoi塔游戏 59
2.2 归并排序算法 62
2.2.1 算法描述与分析 62
2.2.2 程序实现 63
2.2.3 应用——让舞伴更开心 69
2.3 快速排序算法 70
2.3.1 算法描述与分析 70
2.3.2 程序实现 72
2.4 堆的实现 79
2.4.1 堆的概念及其创建 79
2.4.2 程序实现 83
2.5 堆排序 88
2.5.1 算法描述与分析 88
2.5.2 程序实现 89
2.6 基于二叉堆的优先队列 94
2.6.1 算法描述与分析 94
2.6.2 程序实现 95
2.7 关于排序算法 105
2.7.1 比较型排序算法的时间复杂度 105
2.7.2 C/C++/Java提供的排序函数(方法) 107
2.7.3 应用——环法自行车赛 108
2.8 小结 109
第3章 记表备查——动态规划算法 111
3.1 矩阵链乘法 112
3.1.1 算法描述与分析 112
3.1.2 程序实现 115
3.1.3 应用——牛牛玩牌 121
3.2 最长公共子序列 123
3.2.1 算法描述与分析 123
3.2.2 程序实现 126
3.2.3 算法的应用 132
3.3 0-1背包问题 136
3.3.1 算法描述与分析 136
3.3.2 程序实现 138
3.3.3 算法的应用 142
3.4 带权有向图中任意两点间的最短路径 144
3.4.1 算法描述与分析 144
3.4.2 程序实现 148
3.4.3 应用——牛牛聚会 153
3.5 小结 155
第4章 高效的选择——贪婪算法 156
4.1 活动选择问题 156
4.1.1 算法描述与分析 156
4.1.2 程序实现 158
4.1.3 贪婪算法与动态规划 163
4.1.4 应用——海岸雷达 165
4.2 Huffman编码 166
4.2.1 算法描述与分析 166
4.2.2 程序实现 170
4.2.3 应用——Huffman树 180
4.3 最小生成树 183
4.3.1 算法描述与分析 183
4.3.2 程序实现 187
4.3.3 应用——北方通信网 196
4.4 单源最短路径问题 197
4.4.1 算法描述与分析 197
4.4.2 程序实现 200
4.4.3 应用——西气东送 207
4.5 小结 210
第5章 艰苦卓绝——回溯算法 211
5.1 组合问题与回溯算法 211
5.1.1 3-着色问题 211
5.1.2 n-皇后问题 214
5.1.3 Hamilton回路问题 216
5.1.4 子集和问题 218
5.2 解决组合问题的回溯算法框架 219
5.2.1 算法框架 219
5.2.2 程序实现 223
5.3 排列树和子集树 235
5.3.1 子集树问题 236
5.3.2 排列树问题 241
5.4 用回溯算法解决组合优化问题 245
5.4.1 算法框架 245
5.4.2 旅行商问题 247
5.4.3 应用 253
5.5 P,NP和NP-完全问题 260
5.6 小结 262
第6章 图的搜索算法 264
6.1 广度优先搜索 265
6.1.1 算法描述与分析 265
6.1.2 程序实现 268
6.1.3 应用——攻城略地 276
6.2 深度优先搜索 278
6.2.1 算法描述与分析 278
6.2.2 程序实现 280
6.2.3 有向无圈图的拓扑排序 283
6.2.4 应用——全排序 290
6.3 有向图的强连通分支 292
6.3.1 算法描述与分析 292
6.3.2 程序实现 295
6.3.3 应用——亲情号 300
6.4 无向图的双连通分支 303
6.4.1 算法描述与分析 303
6.4.2 程序实现 306
6.4.3 应用——雌雄大盗 308
6.5 流网络与最大流问题 310
6.5.1 算法描述与分析 310
6.5.2 程序实现 319
6.5.3 应用 321
6.6 小结 324
第7章 集组合优化问题之大成——线性规划 325
7.1 标准形式与松弛形式 328
7.1.1 线性规划的标准形式 328
7.1.2 线性规划的松弛形式 331
7.2 单纯形算法 334
7.2.1 单纯形算法的例子 334
7.2.2 轴转操作 337
7.2.3 正规的单纯形算法 340
7.3 初始基本可行解 347
7.4 应用——将组合优化问题形式化为线性规划 355
7.5 小结 359
第8章 图形学基础——计算几何 360
8.1 线段的性质 360
8.1.1 叉积及其应用 361
8.1.2 程序实现 364
8.2 判断是否存在线段相交 367
8.2.1 算法描述与分析 367
8.2.2 程序实现 370
8.3 求凸壳 374
8.3.1 Graham扫描 375
8.3.2 Jarvis行进 381
8.4 求最邻近点对 384
8.4.1 算法描述与分析 385
8.4.2 程序实现 387
8.5 应用 389
8.5.1 光导管 389
8.5.2 最小边界矩形 391
8.5.3 得克萨斯一日游 392
8.6 小结 394
附录 395
参考文献 410