Skip to content

Codes of my MOOC Course <Play with Algorithms>, Both in C++ and Java language. Updated contents and practices are also included. 我在慕课网上的课程《算法与数据结构》示例代码,包括C++和Java版本。课程的更多更新内容及辅助练习也将逐步添加进这个代码仓。

Notifications You must be signed in to change notification settings

ZhuZean/Play-with-Algorithms

 
 

Repository files navigation

算法与数据结构 - 课程官方代码仓

大家好, 欢迎大家来到我在慕课网上的实战课程《算法与数据结构精解》的官方代码仓。这个代码仓将不仅仅包含课程的所有源代码,还将发布课程的更新相关内容,勘误信息以及计划的更多可以丰富课程的内容,如更多分享,多多练习,等等等等。课程源码暂时只提供C++和Java两种语言的源代码。关于更多语言的支持,今后有时间,我会慢慢更新这个代码仓(不过预计会是蜗牛速了>_<)。

在这里感谢 @ShiveryMoon 同学,制作了这个课程代码的完整Python版本,有需要的同学请围观:https://github.com/ShiveryMoon/Imooc-Algorithm-PythonEdition

大家可以下载、运行、测试、修改。如果你发现了任何bug,或者对课程中的任何内容有意见或建议,欢迎和我联系:)

个人网站liuyubobobo.com

电子邮件[email protected]

微博: 刘宇波bobo http://weibo.com/liuyubobobo

知乎: 刘宇波 http://www.zhihu.com/people/liuyubobobo

知乎专栏:是不是很酷 https://zhuanlan.zhihu.com/liuyubobobo

个人公众号:是不是很酷:)

QRCode

课程更新信息

  • v2.0 全套课程配备Java代码(包含已有C++代码的补充内容)。具体参见课程源码目录的Java代码部分。

  • v1.1 全套课程配备补充内容

    • 注:补充代码具体参见课程源码目录每一章的后续部分。并非所有补充内容都包含源码。补充内容本身不是课程学习的必须部分。仅供大家扩展思路参考使用。

    • 关于补充内容,对于课程整体学习,可以忽略。建议先完成课程必要部分学习,再酌情研究补充内容

    • 对于没有源码的补充内容,我会不定期更新代码,但不保证时间。很多内容是我想到的内容,放在目录里,供大家拓展思路使用。大家也可以自行编写代码练习完成补充内容,相信是很好的编程锻炼:)大家加油!

  • v 1.0 全套课程上线

课程相关其他代码仓

更多推荐

BST-Visualization

课程源码目录

第一章 当我们谈论算法的时候,我们在谈论什么? [无代码]
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上提供,大家可以在慕课网上 "下载 -> 查看讲师源码" 中各个章节文件夹下找到。

大家加油!:)

About

Codes of my MOOC Course <Play with Algorithms>, Both in C++ and Java language. Updated contents and practices are also included. 我在慕课网上的课程《算法与数据结构》示例代码,包括C++和Java版本。课程的更多更新内容及辅助练习也将逐步添加进这个代码仓。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 52.1%
  • C++ 46.7%
  • CMake 1.2%