大家好, 欢迎大家来到我在慕课网上的体系课程《算法与数据结构》的官方代码仓。这个代码仓将不仅仅包含课程的所有源代码,还将发布课程的更新相关内容,勘误信息以及计划的更多可以丰富课程的内容,如更多分享,多多练习,等等等等。课程全部使用Java语言讲解,课程代码仓暂时只提供Java语言版本。
大家可以下载、运行、测试、修改。如果你发现了任何bug,或者对课程中的任何内容有意见或建议,欢迎和我联系:)
个人公众号:是不是很酷:)
第一章 欢迎大家来到算法与数据结构的世界 | [无代码] |
---|---|
1-1 欢迎大家来到算法与数据结构的世界 | [无代码] |
1-2 学习算法和数据结构到底有没有用? | [无代码] |
1-3 更多课程学习注意事项 | [无代码] |
1-4 课程编程环境的搭建 | [无代码] |
1-5 【文字】JDK 的国内下载链接,和更多学习方法 | [无代码] |
第二章 线性查找法 | 章节Java源码 |
2-1 什么是算法 | [无代码] |
2-2 最简单的算法:线性查找法 | [无代码] |
2-3 实现线性查找法 | Java |
2-4 使用泛型 | Java |
2-5 使用自定义类测试我们的算法 | Java |
2-6 循环不变量 | [无代码] |
2-7 简单的复杂度分析 | [无代码] |
2-8 常见的时间复杂度 | [无代码] |
2-9 测试算法性能 | Java |
2-10 本章小结 | [无代码] |
第三章 选择排序法 | 章节Java源码 |
3-1 最简单的排序算法:选择排序法 | [无代码] |
3-2 实现选择排序法 | Java |
3-3 使用带约束的泛型 | Java |
3-4 使用 Comparable 接口 | Java |
3-5 选择排序法的复杂度分析 | Java |
3-6 作业:换个角度实现选择排序法 | [无代码] |
3-7 [文字] 作业解析:换个角度实现选择排序法 | Java |
第四章 插入排序法 | 章节Java源码 |
4-1 插入排序法 | [无代码] |
4-2 实现插入排序法 | Java |
4-3 插入排序法的一个小优化 | Java |
4-4 插入排序法的特性 | Java |
4-5 作业:换个角度实现插入排序法 | [无代码] |
4-6 [文字] 作业解析:换个角度实现插入排序法 | Java |
4-7 本章小结 | [无代码] |
第五章 最基础的数据结构:不要小瞧数组 | 章节Java源码 |
5-1 为什么要研究数据结构 | [无代码] |
5-2 使用Java中的数组 | Java |
5-3 二次封装属于我们自己的数组 | Java |
5-4 向数组中添加元素 | Java |
5-5 数组中查询元素和修改元素 | Java |
5-6 包含,搜索和删除 | Java |
5-7 使用泛型 | Java |
5-8 动态数组 | Java |
5-9 简单的复杂度分析 | [无代码] |
5-10 均摊复杂度和防止复杂度的震荡 | Java |
第六章 栈和队列 | 章节Java源码 |
6-1 栈和栈的应用:撤销操作和系统栈 | [无代码] |
6-2 栈的基本实现 | Java |
6-3 栈的另一个应用:括号匹配 | Java |
6-4 关于Leetcode的更多说明 | Java |
6-5 数组队列 | Java |
6-6 循环队列 | Java |
6-7 循环队列的实现 | Java |
6-8 数组队列和循环队列的比较 | Java |
6-9 作业:换个方式实现队列? | [无代码] |
6-10 [文字] 作业解析:不浪费一个空间的循环队列 | Java |
6-11 [文字] 作业解析:没有size成员变量的循环队列 | Java |
6-12 作业:双端队列 | [无代码] |
6-13 [文字] 作业解析:实现双端队列 | Java |
6-14 [文字] 扩展阅读:Java 程序员,别用 Stack?! | [无代码] |
第六章补充:栈和队列其他习题 | 章节Java源码 |
6x-1 作业:用栈实现队列和用队列实现栈 | [无代码] |
6x-2 [文字] 作业解析:用队列实现栈 | Java |
6x-3 [文字] 作业解析:用栈实现队列 | Java |
6x-4 [文字] 更多栈和队列的问题推荐 | [无代码] |
第七章 最基础的动态数据结构:链表 | 章节Java源码 |
7-1 什么是链表 | Java |
7-2 在链表中添加元素 | Java |
7-3 使用链表的虚拟头结点 | Java |
7-4 链表的遍历,查询和修改 | Java |
7-5 从链表中删除元素 | Java |
7-6 使用链表实现栈 | Java |
7-7 带有尾指针的链表:使用链表实现队列 | Java |
7-8 [文字] 链表的性能问题 | Java |
第八章 透过链表看递归 | 章节Java源码 |
8-1 Leetcode中和链表相关的问题 | Java |
8-2 测试自己的Leetcode链表代码 | Java |
8-3 递归基础与递归的宏观语意 | Java |
8-4 链表与递归 | Java |
8-5 递归运行的机制:递归的微观解读 | [无代码] |
8-6 递归算法的调试 | Java |
8-7 作业:链表的递归实现 | [无代码] |
8-8 [文字] 作业解析:链表的递归实现 | Java |
8-9 链表添加元素递归方法的常见问题解析 | [无代码] |
8-10 更多和链表相关的话题 | [无代码] |
8-11 [文字] 斯坦福大学推荐的 18 个链表相关问题 | [无代码] |
第八章补充 链表相关习题 | 章节Java源码 |
8x-1 链表最经典的问题:翻转链表 | [无代码] |
8x-2 翻转链表的非递归实现 | Java |
8x-3 翻转链表的递归实现 | Java |
8x-4 更多链表问题推荐 | [无代码] |
第九章 归并排序法 | 章节Java源码 |
9-1 归并排序法的原理 | [无代码] |
9-2 归并过程 | [无代码] |
9-3 实现归并过程 | Java |
9-4 实现归并排序法 | Java |
9-5 归并排序法的微观解读 | [无代码] |
9-6 作业:在程序上调试跟踪归并排序法 | [无代码] |
9-7 [文字] 作业解析:在程序上调试跟踪归并排序法 | Java |
9-8 归并排序法的复杂度分析 | Java |
第十章 更多关于归并排序法 | 章节Java源码 |
10-1 在有序数组,让归并排序法成为 O(n) 算法 | Java |
10-2 使用插入排序法优化归并排序法 | Java |
10-3 归并排序法的内存操作优化 | Java |
10-4 自底向上的归并排序 | [无代码] |
10-5 实现自底向上的归并排序 | Java |
10-6 作业:使用插入排序法优化自底向上的归并排序 | [无代码] |
10-7 [文字] 作业解析:使用插入排序法优化自底向上的归并排序 | Java |
10-8 求解数组的逆序对数量 | Java |
10-9 快速求解数组的逆序对数量 | Java |
10-10 归并排序法小结 | [无代码] |
第十一章 快速排序法 | 章节Java源码 |
11-1 快速排序法的原理 | [无代码] |
11-2 Partition | [无代码] |
11-3 第一版快速排序法 | Java |
11-4 作业:深入理解快速排序的递归过程 | [无代码] |
11-5 [文字] 作业解析:使用插入排序法优化快速排序法 | Java |
11-6 第一版快速排序法的问题 | [无代码] |
11-7 为快速排序添加随机化 | Java |
11-8 两个作业:深入玩转快速排序 | [无代码] |
11-9 [文字] 作业解析:只创建一个 Random 类 | Java |
11-10 [文字] 作业解析:用算法生成一个特殊的测试用例 | Java |
第十二章 更多关于快速排序法 | 章节Java源码 |
12-1 快速排序算法还有问题 | 无代码 |
12-2 双路快速排序法 | [无代码] |
12-3 实现双路快速排序法 | Java |
12-4 快速排序算法的复杂度分析 | [无代码] |
12-5 三路快速排序法 | [无代码] |
12-6 实现三路快速排序法 | Java |
12-7 作业:一道面试问题,Sort Colors | [无代码] |
12-8 [文字] 作业解析:Sort Colors | Java |
12-9 作业:Select K 问题 | [无代码] |
12-10 [文字解析] 作业解析:Select K 问题 | Java |
12-11 快速排序小结 | [无代码] |
第十三章 二分查找法 | 章节Java源码 |
13-1 二分查找法 | [无代码] |
13-2 二分查找法的递归写法 | Java |
13-3 二分查找法的非递归写法 | Java |
13-4 作业:Select K 的非递归写法 | [无代码] |
13-5 [文字] 作业解析:Select K 的非递归写法 | Java |
13-6 换个定义实现二分查找法 | Java |
13-7 作业:换个定义实现算法 | 无代码 |
13-8 [文字] 作业解析:换个定义实现 SelectK | Java |
13-9 [文字] 作业解析:换个定义实现归并排序法 | Java |
第十四章 更多关于二分查找法 | 章节Java源码 |
14-1 二分查找法的变种:upper | [无代码] |
14-2 实现 upper | Java |
14-3 二分查找法的变种:ceil | Java |
14-4 作业:二分查找法的变种:lower_ceil | [无代码] |
14-5 [文字] 作业解析:实现 lower_ceil | Java |
14-6 二分查找法的变种:lower | [无代码] |
14-7 实现 lower | Java |
14-8 作业:二分查找法的变种:lower_floor 和 upper_floor | [无代码] |
14-9 [文字] 作业解析:实现 lower_floor 和 upper_floor | Java |
14-10 二分查找法总结:二分查找模板 | [无代码] |
14-11 [文字]作业解析:换个方式实现二分查找 | Java |
第十四章补充 二分查找法应用 | 章节Java源码 |
14x-1 Leetcode 875 | [无代码] |
14x-2 编程实现 Leetcode 875 | Java |
14x-3 作业:Leetcode 1011 | [无代码] |
14x-4 [文字] 作业解析:编程实现 Leetcode 1011 | Java |
14x-5 更多二分查找相关问题 | [无代码] |
第十五章 二分搜索树 | 章节Java源码 |
15-1 为什么要研究树结构 | [无代码] |
15-2 二分搜索树基础 | Java |
15-3 向二分搜索树中添加元素 | Java |
15-4 改进添加操作:深入理解递归终止条件 | Java |
15-5 作业:和二分搜索树的添加相关的两个问题 | [无代码] |
15-6 [文字]作业解析:和二分搜索树的添加相关的两个问题 | Java |
15-7 二分搜索树的查询操作 | Java |
15-8 二分搜索树的前序遍历 | Java |
15-9 二分搜索树的中序遍历和后序遍历 | Java |
15-10 深入理解二分搜索树的前中后序遍历 | [无代码] |
15-11 二分搜索树前序遍历的非递归实现 | Java |
15-12 二分搜索树的层序遍历 | Java |
15-13 删除二分搜索树的最大元素和最小元素 | Java |
15-14 删除二分搜索树的任意元素 | Java |
15-15 更多二分搜索树相关话题 | [无代码] |
第十六章 集合和映射 | 章节Java源码 |
16-1 集合基础和基于二分搜索树的集合实现 | Java |
16-2 基于链表的集合实现 | Java |
16-3 集合类的复杂度分析 | Java |
16-4 Leetcode中的集合问题和更多集合相关问题 | Java |
16-5 映射基础 | Java |
16-6 基于链表的映射实现 | Java |
16-7 基于二分搜索树的映射实现 | Java |
16-8 映射的复杂度分析和更多映射相关问题 | Java |
16-9 Leetcode上更多集合和映射的问题 | Java |
第十七章 堆 | 章节Java源码 |
17-1 什么是优先队列 | [无代码] |
17-2 堆的基础表示 | Java |
17-3 向堆中添加元素和Sift Up | Java |
17-4 从堆中取出元素和Sift Down | Java |
17-5 最直观的堆排序 | Java |
17-6 Heapify 和 Replace | Java |
17-7 实现 Heapify | Java |
17-8 优化的堆排序 | Java |
17-9 作业:最小堆 | [无代码] |
17-10 [文字] 作业解析:实现最小堆 | Java |
第十八章 优先队列 | 章节Java源码 |
18-1 基于堆的优先队列 | Java |
18-2 Top K 问题 | Java |
18-3 作业:使用优先队列解决 Select K 问题 | [无代码] |
18-4 [文字] 作业解析:使用优先队列解决 Select K 问题 | Java |
18-5 使用 Java 中的 PriorityQueue | Java |
18-6 使用快排**和优先队列解决 Top K 问题的比较 | [无代码] |
18-7 和堆相关的更多话题和广义队列 | [无代码] |
第十九章 冒泡排序法 | 章节Java源码 |
19-1 冒泡排序的基本** | [无] |
19-2 实现冒泡排序法 | Java |
19-3 冒泡排序的优化 | Java |
19-4 冒泡排序还能优化 | Java |
19-5 作业:换个方式实现冒泡排序 | [无代码] |
19-6 作业解析:换个方式实现冒泡排序 | Java |
19-7 冒泡排序的特点 | [无代码] |
第二十章 希尔排序法 | 章节Java源码 |
20-1 插入排序法和冒泡排序法的启迪 | [无代码] |
20-2 希尔排序法的基本原理 | [无代码] |
20-3 实现希尔排序法 | Java |
20-4 希尔排序法的性能 | Java |
20-5 换个方式实现希尔排序法 | Java |
20-6 步长序列 | Java |
20-7 希尔排序和超参数 | [无代码] |
第二十一章 基于比较排序算法大总结 | [无代码] |
21-1 基于比较排序算法大总结 | [无代码] |
21-2 什么是排序算法的稳定性 | [无代码] |
21-3 基础排序算法的稳定性 | [无代码] |
21-4 高级排序算法的稳定性 | [无代码] |
第二十二章 线段树 | 章节Java源码 |
22-1 什么是线段树 | [无代码] |
22-2 线段树基础表示 | Java |
22-3 创建线段树 | Java |
22-4 线段树中的区间查询 | Java |
22-5 Leetcode上线段树相关的问题 | Java |
22-6 线段树中的更新操作 | Java |
22-7 更多线段树相关的话题 | [无代码] |
第二十三章 Trie | 章节Java源码 |
23-1 什么是Trie字典树 | [无代码] |
23-2 Trie字典树基础 | Java |
23-3 Trie字典树的查询 | Java |
23-4 Trie字典树的前缀查询 | Java |
23-5 Trie字典树和简单的模式匹配 | Java |
23-6 Trie字典树和字符串映射 | Java |
23-7 更多和Trie字典树相关的话题 | [无代码] |
23-8 [文字补充] 基于哈希表或者数组的Trie | Java |
第二十四章 并查集 | 章节Java源码 |
24-1 什么是并查集 | Java |
24-2 Quick Find | Java |
24-3 Quick Union | Java |
24-4 基于size的优化 | Java |
24-5 基于rank的优化 | Java |
24-6 路径压缩 | Java |
24-7 更多和并查集相关的话题 | Java |
第二十五章 平衡树和AVL | 章节Java源码 |
25-1 平衡树和AVL | [无代码] |
25-2 计算节点的高度和平衡因子 | Java |
25-3 检查二分搜索树性质和平衡性 | Java |
25-4 旋转操作的基本原理 | Java |
25-5 左旋转和右旋转的实现 | Java |
25-6 LR 和 RL | Java |
25-7 从AVL树中删除元素 | Java |
25-8 基于AVL树的集合和映射 | Java |
第二十六章 红黑树 | 章节Java源码 |
26-1 红黑树与2-3树 | [无代码] |
26-2 2-3树的绝对平衡性 | [无代码] |
26-3 红黑树与2-3树的等价性 | Java |
26-4 红黑树的基本性质和复杂度分析 | [无代码] |
26-5 保持根节点为黑色和左旋转 | Java |
26-6 颜色翻转和右旋转 | Java |
26-7 红黑树中添加新元素 | Java |
26-8 红黑树的性能测试 | Java |
26-9 更多红黑树相关的话题 | [无代码] |
26-10 [文字] 红黑树任何不平衡都可以在三次旋转内解决? | [无代码] |
26-11 [文字] 不会白板编程红黑书就是基础差?别扯了 | [无代码] |
第二十七章 哈希表 | 章节Java源码 |
27-1 哈希表基础 | Java |
27-2 哈希函数 | [无代码] |
27-3 Java中的hashCode方法 | Java |
27-4 链地址法 Seperate Chaining | [无代码] |
27-5 实现属于我们自己的哈希表 | Java |
27-6 哈希表的动态空间处理与复杂度分析 | Java |
27-7 哈希表更复杂的动态空间处理方法 | Java |
27-8 更多哈希冲突的处理方法 | [无代码] |
第二十八章 SQRT 分解 | 章节Java源码 |
28-1 什么是 SQRT 分解 | [无代码] |
28-2 SQRT 分解的区间查询 | [无代码] |
28-3 实现 SQRT 分解的区间查询 | Java |
28-4 SQRT 分解的更新操作 | Java |
28-5 作业以及 SQRT 分解总结 | [无代码] |
28-6 [文字] 作业解析:使用 SQRT 分解解决区间最大最小问题 | Java |
28-7 [文字] 作业解析:封装更通用的 SQRT 分解结构 | Java |
第二十九章 计数排序和 LSD 基数排序 | 章节Java源码 |
29-1 什么是计数排序 | [无代码] |
29-2 使用计数排序解决力扣 75 号问题 | Java |
29-3 更一般的计数排序算法 | [无代码] |
29-4 实现更一般的计数排序算法 | Java |
29-5 计数排序算法的重要性质:稳定性 | [无代码] |
29-6 验证计数排序算法的稳定性 | Java |
29-7 LSD 字符串排序算法 | [无代码] |
29-8 实现 LSD 字符串排序算法 | Java |
29-9 LSD 字符串排序算法的性能测试 | Java |
29-10 更多关于 LSD 字符串排序算法的讨论 | [无代码] |
课程更新中,敬请期待:)
大家加油!:)