大家好, 欢迎大家来到我在慕课网上的实战课程《算法与数据结构精解》的官方代码仓。这个代码仓将不仅仅包含课程的所有源代码,还将发布课程的更新相关内容,勘误信息以及计划的更多可以丰富课程的内容,如更多分享,多多练习,等等等等。课程源码暂时只提供C++和Java两种语言的源代码。关于更多语言的支持,今后有时间,我会慢慢更新这个代码仓(不过预计会是蜗牛速了>_<)。
在这里感谢 @ShiveryMoon 同学,制作了这个课程代码的完整Python版本,有需要的同学请围观:https://github.com/ShiveryMoon/Imooc-Algorithm-PythonEdition
大家可以下载、运行、测试、修改。如果你发现了任何bug,或者对课程中的任何内容有意见或建议,欢迎和我联系:)
个人网站:liuyubobobo.com
微博: 刘宇波bobo http://weibo.com/liuyubobobo
知乎: 刘宇波 http://www.zhihu.com/people/liuyubobobo
知乎专栏:是不是很酷 https://zhuanlan.zhihu.com/liuyubobobo
个人公众号:是不是很酷:)
-
v2.0 全套课程配备Java代码(包含已有C++代码的补充内容)。具体参见课程源码目录的Java代码部分。
-
v1.1 全套课程配备补充内容
-
注:补充代码具体参见课程源码目录每一章的后续部分。并非所有补充内容都包含源码。补充内容本身不是课程学习的必须部分。仅供大家扩展思路参考使用。
-
关于补充内容,对于课程整体学习,可以忽略。建议先完成课程必要部分学习,再酌情研究补充内容。
-
对于没有源码的补充内容,我会不定期更新代码,但不保证时间。很多内容是我想到的内容,放在目录里,供大家拓展思路使用。大家也可以自行编写代码练习完成补充内容,相信是很好的编程锻炼:)大家加油!
-
-
v 1.0 全套课程上线
-
我的LeetCode题解代码仓:Play Leetcode (注:以C++实现为主)
-
LeetCode Explore题解代码仓:Play Leetcode Explore (注:以C++实现为主)
- Leetcode Explore 是 Leetcode 在2017年底上线的新模块,分门别类地整理了Leetcode上的问题。如果刷Leetcode一时不知从哪里下手,可以从Leetcode Explore为指引开始:)
-
感谢学习课程的大佬 @ShiveryMoon 同学使用Python语言实现了课程的所有代码,甚至还有不少拓展和补充。有使用Python语言的同学,可以去大佬的代码仓观望。传送门:https://github.com/ShiveryMoon/Imooc-Algorithm-PythonEdition
-
感谢学习课程的大佬 @摘星fy基于Canvas实现的堆和任意二分搜索树的可视化。有兴趣的同学可以去大佬的代码仓围观。
- 堆的可视化:https://github.com/kingAnyWHere/MaxHeap
- 任意二分搜索树的可视化 :https://github.com/kingAnyWHere/canvas-binary-search
- 以下为截图:)
第一章 当我们谈论算法的时候,我们在谈论什么? | [无代码] | |
---|---|---|
1-1 我们究竟为什么要学习算法 | [无代码] | |
1-2 课程介绍 | [无代码] | |
第二章 排序基础 | 章节C++源码 | 章节Java源码 |
2-1 选择排序 - Selection Sort | C++源码 | Java源码 |
2-2 使用模板(泛型)编写算法 | C++源码 | Java源码 |
2-3 随机生成算法测试用例 | C++源码 | Java源码 |
2-4 测试算法的性能 | C++源码 | Java源码 |
2-5 插入排序法 - Insertion Sort | C++源码 | Java源码 |
2-6 插入排序法的改进 | C++源码 | Java源码 |
2-7 更多关于O(n^2)排序算法的思考 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 选择排序算法的优化 | C++源码 | Java源码 |
补充2 冒泡排序法 - Bubble Sort | C++源码 | Java源码 |
补充3 希尔排序法 - Shell Sort | C++源码 | Java源码 |
补充4 选择排序算法可视化 (Java) | 看得见的算法 | 第四章1,2小节 |
补充5 插入排序算法可视化 (Java) | 看得见的算法 | 第四章3,4小节 |
第三章 高级排序算法 | 章节C++源码 | 章节Java源码 |
3-1 归并排序法 - Merge Sort | [无代码] | |
3-2 归并排序法的实现 | C++源码 | Java源码 |
3-3 归并排序法的优化 | C++源码 | Java源码 |
3-4 自底向上的归并排序算法 | C++源码 | Java源码 |
3-5 快速排序法 - Quick Sort | C++源码 | Java源码 |
3-6 随机化快速排序法 | C++源码 | Java源码 |
3-7 双路快速排序法 | C++源码 | Java源码 |
3-8 三路快速排序法 | C++源码 | Java源码 |
3-9 归并排序和快速排序的衍生问题 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 归并排序的另外一个优化,在merge外申请aux空间 | C++源码 | Java源码 |
补充2 自顶向下和自底向上的归并排序的比较 | C++源码 | Java源码 |
补充3 ShellSort, MergeSort 和 QuickSort 的比较 | C++源码 | Java源码 |
补充4 归并排序算法可视化 (Java) | 看得见的算法 | 第四章5,6小节 |
补充5 快速排序算法可视化 (Java) | 看得见的算法 | 第四章7-10小节 |
补充6 归并排序思路求逆序数 | C++源码 | Java源码 |
补充7 求任意数组第k小(大)的值 | C++源码 | Java源码 |
补充8 对链表的O(nlogn)级别的排序 | [整理中] | [敬请期待] |
补充9 更多归并排序优化**的实验 | [整理中] | [敬请期待] |
补充10 更多快速排序优化**的实验 | [整理中] | [敬请期待] |
第四章 堆和堆排序 | 章节C++源码 | 章节Java源码 |
4-1 为什么使用堆 | [无代码] | |
4-2 堆的基本存储 | C++源码 | Java源码 |
4-3 Shift Up | C++源码 | Java源码 |
4-4 Shift Down | C++源码 | Java源码 |
4-5 基础堆排序和Heapify | C++源码 | Java源码 |
4-6 优化的堆排序 - Heap Sort | C++源码 | Java源码 |
4-7 排序算法总结 | [无代码] | |
4-8 索引堆 - Index Heap | C++源码 | Java源码 |
4-9 索引堆的优化 | C++源码 | Java源码 |
4-10 和堆相关的其他问题 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 优化的Shift Up和Shift Down | C++源码 | Java源码 |
补充2 最小堆 | C++源码 | Java源码 |
补充3 最小索引堆 | C++源码 | Java源码 |
补充4 从0开始索引的最大堆和最小堆 | 玩转数据结构 | 第八章 |
补充5 从0开始索引的最大索引堆和最小索引堆 | [整理中] | [敬请期待] |
补充6 堆排序可视化 (Java) | 看得见的算法 | 第四章第11小节 |
补充7 可以空间动态扩展的堆结构 | 玩转数据结构 | 第八章 |
补充8 N个元素中的前M大(或小)元素 | 玩转数据结构 | 第八章 7,8小节 |
补充9 双向优先队列 | [整理中] | [敬请期待] |
补充10 多叉堆 | [整理中] | [敬请期待] |
补充11 斐波那契额堆 | [整理中] | [敬请期待] |
补充12 索引排序 | [整理中] | [敬请期待] |
补充13 添加索引,不稳定排序转换成稳定排序 | [整理中] | [敬请期待] |
补充14 基于事件堆的例子碰撞检测 (Java) | [整理中] | [敬请期待] |
第五章 二分搜索树 | 章节C++源码 | 章节Java源码 |
5-1 二分查找法(Binary Search) | C++源码 | Java源码 |
5-2 二分搜索树基础(Binary Search Tree) | C++源码 | Java源码 |
5-3 二分搜索树的节点插入 | C++源码 | Java源码 |
5-4 二分搜索树的查找 | C++源码 | Java源码 |
5-5 二分搜索树的遍历(深度优先遍历) | C++源码 | Java源码 |
5-6 层序遍历(广度优先遍历) | C++源码 | Java源码 |
5-7 删除最大值,最小值 | C++源码 | Java源码 |
5-8 二分搜索树节点的删除(Hubbard Deletion) | C++源码 | Java源码 |
5-9 二分搜索树的顺序性 | [无代码] | |
5-10 二分搜索树的局限性 | C++源码 | Java源码 |
5-11 树形问题和更多树 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 二分查找法改变变量定义,论如何写出正确算法 | 玩转算法面试 | 第三章1,2小节 |
补充2 二分搜索法的floor和ceil | C++源码 | Java源码 |
补充3 二分搜索法的lower bound和upper bound | C++源码 | Java源码 |
补充4 二分搜索的总结 | C++源码 | Java源码 |
补充5 二分搜索树中的floor和ceil | C++源码 | Java源码 |
补充6 二分搜索树中的前驱和后继 | C++源码 | Java源码 |
补充7 二分搜索树中的rank和select | [整理中] | [敬请期待] |
补充8 二分搜索树前中后序非递归遍历 深入理解非递归和递归的区别,以及非递归和栈的关系 |
玩转算法面试 | 第六章2,3小节 |
补充9 二叉树前中后序遍历的经典非递归实现 | C++ | Java |
补充10 二叉树的Morris前中后序遍历 | C++ | Java |
补充11 二分搜索树整体的非递归实现 | [整理中] | [敬请期待] |
补充12 二分搜索树的另一个应用:Tree Set | 玩转数据结构 | 第六章,第七章 |
补充13 允许重复键值的二分搜索树:Multi Tree Set / Map | [整理中] | [敬请期待] |
补充14 更多二分搜索树(或者二叉树)相关的面试问题 | 玩转算法面试 | 第七章 |
补充15 二叉树的公共祖先 (LCA) | [整理中] | [敬请期待] |
补充16 树形问题和回溯法 | 玩转算法面试 | 第八章 |
补充17 树形问题之八皇后问题 | 玩转算法面试 | 第八章第8小节 |
补充18 走迷宫 (Java) | 看得见的算法 | 第五章 |
补充19 树形问题之 Move the Box 求解 (Java) | 看得见的算法 | 第八章 |
补充20 线段树 (区间树) | 玩转数据结构 | 第九章 |
补充21 Trie | 玩转数据结构 | 第十章 |
补充22 KD树 | [整理中] | [敬请期待] |
补充23 哈夫曼树 | [整理中] | [敬请期待] |
补充24 使用哈夫曼树进行文件压缩 | [整理中] | [敬请期待] |
补充25 AVL树 | 玩转数据结构 | 第十二章 |
补充26 红黑树 | 玩转数据结构 | [第十三章] |
补充27 伸展树 | [整理中] | [敬请期待] |
补充28 B类树 | 玩转数据结构 | [第十六章] |
补充29 Treap | [整理中] | [敬请期待] |
补充30 树形问题之数独求解 | [整理中] | [敬请期待] |
补充31 数独求解之特殊数据结构 | [整理中] | [敬请期待] |
补充32 树形问题之八数码问题 (A*算法初步) | [整理中] | [敬请期待] |
补充33 树形问题之推箱子自动求解 | [整理中] | [敬请期待] |
第六章 并查集 | 章节C++源码 | 章节Java源码 |
6-1 并查集基础(Union Find) | [无代码] | |
6-2 Quick Find | C++源码 | Java源码 |
6-3 Quick Union | C++源码 | Java源码 |
6-4 基于size的优化 | C++源码 | Java源码 |
6-5 基于rank的优化 | C++源码 | Java源码 |
6-6 路径压缩(Path Compression) | C++源码 | Java源码 |
本章课程最终代码 | C++源码 | Java源码 |
补充1 使用相同的测试用例测试不同的UF实现 | C++源码 | Java源码 |
补充2 迭代和递归实现两种路径压缩的区别 | C++源码 | Java源码 |
第七章 图的基础 | 章节C++源码 | 章节Java源码 |
7-1 图论基础 | [无代码] | |
7-2 图的表示 | C++源码 | Java源码 |
7-3 相邻节点迭代器 | C++源码 | Java源码 |
7-4 图的算法框架 | C++源码 | Java源码 |
7-5 深度优先遍历和联通分量 | C++源码 | Java源码 |
7-6 寻路 | C++源码 | Java源码 |
7-7 广度优先遍历和无权图的最短路径 | C++源码 | Java源码 |
7-8 迷宫生成,PS抠图 —— 更多无权图的应用 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 Floodfill算法练习题 | 玩转算法面试 | 第八章第7小节 |
补充2 Floodfill算法可视化 (Java) | [整理中] | [敬请期待] |
补充3 扫雷游戏模型 | 看得见的算法 | 第七章 |
补充4 随机迷宫生成 | 看得见的算法 | 第六章 |
补充5 欧拉路径 | [整理中] | [敬请期待] |
补充6 哈密尔顿路径 | [整理中] | [敬请期待] |
补充7 Blue Path 自动求解 | [整理中] | [敬请期待] |
补充8 地图填色问题 | [整理中] | [敬请期待] |
补充9 二分图和二分图的最有匹配 | [整理中] | [敬请期待] |
补充10 墙为线条的迷宫生成 | [整理中] | [敬请期待] |
补充11 六边形的迷宫生成 | [整理中] | [敬请期待] |
补充12 TSP问题 | [整理中] | [敬请期待] |
补充13 TSP问题之遗传算法初步 | [整理中] | [敬请期待] |
第八章 最小生成树 | 章节C++源码 | 章节Java源码 |
8-1 有权图 | C++源码 | Java源码 |
8-2 最小生成树问题和切分定理 | [无代码] | |
8-3 Prim算法的第一个实现 (Lazy Prim) | C++源码 | Java源码 |
8-4 Prim算法的优化 | [无代码] | |
8-5 优化后的Prim算法的实现 | C++源码 | Java源码 |
8-6 Kruskal算法 | C++源码 | Java源码 |
8-7 最小生成树算法的思考 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 Prim算法可视化 (Java) | [整理中] | [敬请期待] |
补充2 Kruskal算法可视化 (Java) | [整理中] | [敬请期待] |
补充3 图的最小生成树的个数 | [整理中] | [敬请期待] |
补充4 Vyssotsky Algorithm | [整理中] | [敬请期待] |
第九章 最短路径 | 章节C++源码 | 章节Java源码 |
9-1 最短路径问题和松弛操作(Relaxation) | [无代码] | |
9-2 Dijkstra的算法** | [无代码] | |
9-3 实现Dijkstra算法 | C++源码 | Java源码 |
9-4 负权边和Bellman-Ford算法 | [无代码] | |
9-5 实现Bellman-Ford算法 | C++源码 | Java源码 |
9-6 更多和最短路径相关的思考 | [无代码] | |
本章课程最终代码 | C++源码 | Java源码 |
补充1 Dijkstra算法的可视化 (Java) | [整理中] | [敬请期待] |
补充2 SPFA算法 | [整理中] | [敬请期待] |
补充3 有向无环图(DAG)的拓扑排序 | [整理中] | [敬请期待] |
补充4 Floyed算法 | [整理中] | [敬请期待] |
补充5 使用Bellman-Ford求最长路径 | [整理中] | [敬请期待] |
补充6 使用拓扑排序求有向无环图(DAG)的最长路径 | [整理中] | [敬请期待] |
补充7 使用Floyed算法求所有对的最长路径 | [整理中] | [敬请期待] |
第十章 结束语 | [无代码] | |
10-1 总结:算法**,大家加油! | [无代码] |
注: 课程讲义的PDF版本不在github上提供,大家可以在慕课网上 "下载 -> 查看讲师源码" 中各个章节文件夹下找到。
大家加油!:)