第 1 章 一大波数正在靠近——排序 ................................................................................................... 1
第 1节 最快最简单的排序——桶排序 ......................................................................................... 2
第 2节 邻居好说话——冒泡排序 ................................................................................................. 7
第 3节 最常用的排序——快速排序 ........................................................................................... 12
第 4节 小哼买书 .......................................................................................................................... 20
第 2 章 栈、队列、链表 ..................................................................................................................... 25
第 1节 解密 QQ号——队列 ....................................................................................................... 26
第 2节 解密回文——栈 .............................................................................................................. 32
第 3节 纸牌游戏——小猫钓鱼 ................................................................................................... 35
第 4节 链表 .................................................................................................................................. 44
第 5节 模拟链表 .......................................................................................................................... 54
第 3 章 枚举!很暴力 ......................................................................................................................... 57
第 1节 坑爹的奥数 ...................................................................................................................... 58
第 2节 炸弹人 .............................................................................................................................. 61
第 3节 火柴棍等式 ...................................................................................................................... 67
第 4节 数的全排列 ...................................................................................................................... 70
第 4 章 万能的搜索 ............................................................................................................................. 72
第 1节 不撞南墙不回头——深度优先搜索 ............................................................................... 73
第 2节 解救小哈 .......................................................................................................................... 81
第 3节 层层递进——广度优先搜索 ........................................................................................... 88
第 4节 再解炸弹人 ...................................................................................................................... 95
第 5节 宝岛探险 ........................................................................................................................ 106
第 6节 水管工游戏 .................................................................................................................... 117
第 5 章 图的遍历 ............................................................................................................................... 128
第 1节 深度和广度优先究竟是指啥 ........................................................................................ 129
第 2节 城市地图——图的深度优先遍历 ................................................................................. 136
啊哈!算法
8
第 3节 最少转机——图的广度优先遍历 ................................................................................. 142
第 6 章 最短路径 ............................................................................................................................... 147
第 1节 只有五行的算法——Floyd-Warshall ............................................................................ 148
第 2节 Dijkstra算法——通过边实现松弛 ............................................................................... 155
第 3节 Bellman-Ford——解决负权边 ....................................................................................... 163
第 4节 Bellman-Ford的队列优化 .............................................................................................. 171
第 5节 最短路径算法对比分析 ................................................................................................. 177
第 7 章 神奇的树 ............................................................................................................................... 178
第 1节 开启“树”之旅 ............................................................................................................. 179
第 2节 二叉树 ............................................................................................................................. 183
第 3节 堆——神奇的优先队列 ................................................................................................. 185
第 4节 擒贼先擒王——并查集 ................................................................................................. 200
第 8 章 更多精彩算法 ....................................................................................................................... 211
第 1节 镖局运镖——图的最小生成树 ..................................................................................... 212
第 2节 再谈最小生成树 ............................................................................................................. 219
第 3节 重要城市——图的割点 ................................................................................................. 229
第 4节 关键道路——图的割边 ................................................................................................. 234
第 5节 我要做月老——二分图最大匹配 ................................................................................. 237
第 9 章 还能更好吗——微软亚洲研究院面试 ................................................................................ 243
1.1桶排序---O(N+M)
1.2冒泡排序---O(N^2)
1.3快速排序---O(NlogN)
1,找基准数 2,先从右往左找到一个小于6的数,再从左往右找一个大于6的数,交换
1.4 去重、排序
第一种方法:桶排序、
第二种方法:先排序、后去重,冒泡排序或者快速排序
2.1 队列
线性结构,只允许在队列的首部 head 进行删除,在队列的尾部 tail 插入
例子:买票;先进先出 FIFO
结构体类型:
struct queue { int data[100];//队列的主体,用来存储内容 int head;//队首 int tail;//队尾 };
2.2 栈
例子:小桶放球;后进先出
top:指向栈顶的变量
用途:判断回文词,
2.4 链表
C语言中,可以使用 指针和函数malloc来实现。
也可以用数组模拟链表
结构体 node,两个成员,data和指针
struct node *head; head = NULL;//头指针为空 struct node *p; //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点 p = (struct node *)malloc(sizeof(struct node)); scanf("%d",&a); p->data = a;//将数据存储到当前结点的data域中 p->next = NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
->叫做结构体指针运算符,也是用来访问结构体内部成员的。因为此处p是一个指针,所以不能使用.号访问内部成员。
2.5 模拟链表
用数组模拟链表
两个数组,data 和 left
3.1 枚举
3.2 炸弹人
使用数组模拟地图
3.3 火柴棍模式
核心是 求方程的解,
3.4 数的全排列
4.1 深度优先搜索 (Depth First Search, DFS)
基本模型
void dfs(int step) { //判断边界 //尝试每一种可能 for(i=1;i<=n;i++) { 继续下一步 dfs(step+1); } 返回 }