第1章 基础知识 1
1.1 数据结构与算法 1
1.2 抽象数据类型 2
1.3 C语言程序设计基础 4
1.3.1 数组 4
1.3.2 指针 7
1.3.3 结构体和共用体 12
1.3.4 函数与参数 17
1.3.5 递归函数 20
1.3.6 局部变量和全局变量 25
习题1 27
第2章 算法分析 29
2.1 算法的定义 29
2.2 空间复杂度 30
2.3 时间复杂度 30
2.3.1 程序步 31
2.3.2 最好、最差和平均性能 33
2.3.3 近似方法(O,Ω,Θ) 35
2.4 时间复杂度的测试 47
习题2 49
第3章 线性表、堆栈和队列 52
3.1 线性表 52
3.1.1 线性表的定义 52
3.1.2 线性表的数组表示 53
3.1.3 线性表的链表表示 57
3.1.4 稀疏矩阵与多重表 63
3.2 堆栈 68
3.2.1 迷宫问题 68
3.2.2 堆栈的定义 69
3.2.3 堆栈的实现 70
3.3 队列 77
3.3.1 队列的定义 77
3.3.2 队列的表示与操作 78
3.3.3 环形队列 80
习题3 85
第4章 树 87
4.1 树的定义 88
4.2 树的表示 89
4.3 二叉树 91
4.3.1 二叉树的定义 91
4.3.2 二叉树的性质 92
4.3.3 二叉树的遍历 93
4.3.4 表达式树的构造 96
4.4 二叉搜索树 98
4.4.1 二叉搜索树的性质 98
4.4.2 二叉搜索树的搜索 98
4.4.3 查找最大和最小元素 99
4.4.4 二叉搜索树的插入 100
4.4.5 二叉搜索树的删除 101
4.5 线索二叉树 103
4.5.1 线索二叉树的遍历 104
4.5.2 二叉搜索树的插入 105
4.6 B-树 106
4.6.1 B-树的组成形式 106
4.6.2 B-树的插入 107
4.6.3 B-树的删除 109
4.7 集散集合 110
4.7.1 等价关系 110
4.7.2 动态等价问题 111
4.7.3 基本数据结构 112
4.7.4 集合的加权合并 114
习题4 116
第5章 查找 119
5.1 静态查找 119
5.1.1 概述 119
5.1.2 最优二叉搜索树(Optimal Binary Search Tree)的构造 120
5.1.3 效率分析 122
5.2 动态查找 123
5.2.1 概述 123
5.2.2 AVL树 123
5.2.3 伸展树Splay tree 128
5.3 哈希映射 130
5.3.1 概述 130
5.3.2 哈希表 131
5.3.3 哈希函数 132
5.3.4 冲突处理 133
习题5 140
第6章 堆(优先队列) 142
6.1 堆的定义和表示 142
6.2 最大堆 143
6.2.1 最大堆的插入 144
6.2.2 最大堆的删除 145
6.2.3 最大堆的建立 147
6.3 最小-最大堆(Min-Max堆) 150
6.3.1 Min-Max堆的插入 150
6.3.2 Min-Max堆的删除 153
6.4 左右堆(Deap) 155
6.4.1 Deap的定义 155
6.4.2 Deap的插入 156
6.4.3 Deap中最大元素的删除 160
6.5 左高堆(Leftist Heaps) 162
6.5.1 左高堆的性质 162
6.5.2 左高堆的操作 163
习题6 168
第7章 排序 170
7.1 插入排序 170
7.1.1 算法 170
7.1.2 效率分析 171
7.1.3 其他改进 172
7.2 希尔排序 172
7.2.1 算法 172
7.2.2 效率分析 174
7.3 堆排序 174
7.3.1 算法 174
7.3.2 效率分析 176
7.4 快速排序 176
7.4.1 算法 176
7.4.2 效率分析 179
7.5 比较排序法的最优效率 180
7.6 归并排序 181
7.6.1 算法 181
7.6.2 效率分析 185
7.7 基数排序 185
7.7.1 算法 185
7.7.2 效率分析 188
7.8 表排序 189
7.8.1 算法 189
7.8.2 效率分析 190
7.9 外排序 191
7.9.1 概述 191
7.9.2 多路归并 192
7.9.3 并行处理 194
7.9.4 归并段的生成 196
7.9.5 最优归并策略 196
习题7 198
第8章 图 200
8.1 图的定义 200
8.2 图的表示 202
8.2.1 邻接矩阵法 202
8.2.2 邻接表法 203
8.3 图的遍历 204
8.3.1 深度优先搜索 204
8.3.2 广度优先搜索 206
8.3.3 生成树 207
8.3.4 最小生成树 207
8.3.5 连通分量 211
8.3.6 重连通 211
8.4 拓扑排序 215
8.5 迪克斯特拉(Dijkstra)最短路径算法 219
8.6 关键路径分析 223
8.7 Euler环问题 226
8.8 强连通分量 228
习题8 230
第9章 算法设计技术 233
9.1 贪心法 233
9.1.1 概述 233
9.1.2 连续背包问题 233
9.1.3 作业调度问题 233
9.1.4 哈夫曼(Huffman)编码 237
9.1.5 装箱问题 241
9.2 分治法 243
9.2.1 概述 243
9.2.2 最近点对问题 244
9.2.3 找第k个最小元问题 245
9.3 动态规划 247
9.3.1 概述 247
9.3.2 0-1背包问题 248
9.3.3 矩阵连乘问题 251
9.3.4 最长公共子序列问题 253
9.4 回溯法 255
9.4.1 概述 255
9.4.2 八皇后问题 256
9.4.3 点集重构问题 258
9.4.4 回溯法的效率分析 260
9.5 限界剪枝法 261
9.5.1 概述 261
9.5.2 有限期的作业调度问题 262
9.5.3 旅行商问题 264
9.5.4 效率分析 267
习题9 268
参考文献 271