学习首页交互演示 · JavaScript

原理 · 代码 · 动画

数据结构与算法可视化

通过 44 个交互课程学习排序、查找、图算法、动态规划和数据结构。阅读原理、执行步骤和 JavaScript 代码,配合动画观察执行过程,并完成相关练习。

排序算法9 个课程

  • 冒泡排序

    比较相邻元素,将较大的值逐轮移动到右侧。

  • 快速排序

    选定基准值完成分区,再递归排序左右两侧。

  • 选择排序

    扫描未排序区间,选出最小值放到区间起点。

  • 插入排序

    逐个将新元素插入左侧有序区间。

  • 归并排序

    递归拆分区间,再将两个有序区间合并。

  • 堆排序

    建立最大堆,依次把堆顶最大值放到数组末尾。

  • 希尔排序

    按递减间隔分组插入,最后以间隔 1 完成排序。

  • 计数排序

    统计各数值出现次数,再按累计位置写入输出数组。

  • 基数排序

    从个位起按当前数位稳定分桶,再按桶号依次收集。

查找算法2 个课程

  • 顺序查找

    从左到右逐项比较,找到目标后返回下标。

  • 二分查找

    在升序数组中比较中点,每次排除一半查找区间。

图算法7 个课程

  • 广度优先遍历

    使用队列逐层访问图节点,并在入队时标记已发现节点。

  • 深度优先遍历

    沿一条分支深入,在访问完邻接节点后回溯。

  • Dijkstra 最短路径

    确定当前距离最小的节点,再松弛它的出边。

  • 拓扑排序

    将入度为零的节点依次移出,形成依赖执行顺序。

  • Kruskal 最小生成树

    按权重尝试连接两个分量,使用并查集排除形成环的边。

  • A* 寻路

    按已走步数与到终点的估计步数之和,选择下一格进行扩展。

  • Floyd 最短路径

    逐个允许顶点作为中间节点,更新任意两点之间的最短距离。

数组算法5 个课程

  • 滑动窗口

    维护固定长度窗口的和,寻找总和最大的连续区间。

  • 前缀和

    预先累计数组,再通过两个前缀之差求区间和。

  • 双指针

    在有序数组两端移动指针,寻找和为目标值的一对元素。

  • 单调栈

    保存尚未等到更高温度的日期,遇到更高温度时回填等待天数。

  • 单调队列

    维护温度或数值的候选下标,输出每个滑动窗口中的最大值。

字符串算法1 个课程

动态规划4 个课程

  • 零钱兑换

    从小金额推导大金额,计算凑出目标金额的最少硬币数。

  • 0/1 背包

    在容量限制下,每件物品最多选择一次,逐格比较选与不选的价值。

  • 最长公共子序列

    比较两个字符串的前缀,在二维表中计算并回溯公共子序列。

  • 最长递增子序列

    为每个元素寻找可接续的前驱,记录长度并还原递增子序列。

贪心与回溯4 个课程

  • 区间调度

    优先选择结束最早的区间,求最多互不重叠的区间集合。

  • 子集枚举

    选择一个元素后递归深入,再撤销选择,枚举全部子集。

  • N 皇后

    逐行尝试放置皇后,遇到同列或对角线冲突时回溯。

  • 哈夫曼编码

    反复合并频次最小的两棵树,沿树的左右分支生成前缀编码。

数据结构12 个课程

  • 数组

    按连续下标读取数据,插入和删除时移动后续元素。

  • 单链表

    节点保存数据和 next 指针,通过链接组织顺序。

  • 栈

    在栈顶压入和弹出元素,遵循后进先出。

  • 循环队列

    使用 head、size 和环形槽位实现先进先出。

  • 哈希表

    根据哈希值定位桶,使用链式结构处理冲突。

  • 二叉搜索树

    左子树值小于节点,右子树值大于节点。

  • 最小堆

    完全二叉树的父节点不大于孩子,堆顶保存最小值。

  • 双端队列

    使用双向链接,在队首和队尾分别插入或移除节点。

  • 并查集

    通过代表节点管理集合,使用按大小合并和路径压缩。

  • 字典树

    复用字符串的公共前缀,用词尾标记区分完整单词。

  • 树状数组

    利用 lowbit 管理累计区间,实现单点增量与前缀查询。

  • 图

    使用邻接表保存节点关系,逐条加入无向边。