数据结构与算法演示台SUANFA.NET.CN · STEP BY STEP

约定 · 核验 · 更新于 2026-09-22

约定与核验

这是一个教学演示站,讲的是通用的数据结构与算法,没有法规条文或「官方原文」可以引用。页面上的伪代码、复杂度说明和要点都由本站编写,下面把写法约定和正确性的核验方式逐条写清楚。

01

写法与计数约定(本站归纳)

伪代码写法

下标从 0 开始;「a ← b」表示赋值;「i ← 0 … n−1」表示 i 依次取 0 到 n−1(含两端);区间 [lo..hi] 含两端。伪代码由本站编写,只为配合演示逐行对照,不对应任何特定教材或编程语言。

复杂度记法

用大 O 表示随输入规模 n 增长的量级,忽略常数。图算法里 V 是顶点数、E 是边数;树遍历里 h 是树高、w 是最宽一层的结点数。「空间」指除输入本身以外需要的额外空间,递归算法把调用栈算在内。

比较次数怎么数

排序与查找演示里的「比较次数」只数元素之间(或元素与目标值)的比较,不数循环下标的比较。二分查找每轮先判相等、再判大小,最多记 2 次。

相等元素怎么处理

冒泡、插入只在「严格大于」时移动,归并在两头相等时先取左段,所以这三种是稳定的;选择、快速、堆排序会远距离交换,不稳定。快速排序演示用「严格小于基准」划分,全部相等的输入会退化到最坏情况,这是有意保留的,便于观察。

邻居的处理顺序

图演示里每个顶点的邻居按名称排序后依次处理(字母序,数字按数值),所以同一输入每次的访问顺序一致。换一种顺序,BFS/DFS 的访问序列可能不同,但都是正确的遍历。

输入规模上限

排序与查找最多 16 个数,树最多 20 个结点、6 层,图最多 10 个顶点、20 条边,栈与队列容量 6。上限只是为了让每一步在手机屏幕上看得清,不是算法本身的限制。

02

正确性怎么核验

每次构建前运行自动测试,任何一条不通过就不发布。
  1. 每种排序对 300 组随机输入(含重复值、负数)与边界输入(空数组、1 个数、全部相等、已排好、完全逆序)的结果,都与 JavaScript 内置排序的结果逐项一致。

  2. 冒泡、插入、归并三种排序在有重复值时保持相等元素的原有次序(稳定性检查)。

  3. 快速排序对已排好的 16 个数恰好比较 120 次(= 16×15/2),对随机排列的平均比较次数与理论值 2(n+1)Hₙ − 4n 相差不到 1 次。

  4. 顺序查找返回第一次出现的位置;二分查找在有序数组上找得到时返回的位置确实等于目标,找不到时返回 −1。

  5. 栈与循环队列对随机操作序列的出栈/出队顺序、剩余内容,与用普通数组直接模拟的结果一致,上溢、下溢、队满、队空都被拒绝。

  6. 四种树遍历对随机生成的二叉树,与另写的一份参考实现输出完全相同;空树、只有根、退化成链的树也逐一检查。

  7. BFS 在随机图上得到的层数与参考实现一致;Dijkstra 的最短距离与 Bellman-Ford 参考实现在 200 张随机图上全部相同,不可达顶点记为 ∞。

  8. 所有演示的每一帧都指向存在的伪代码行;同一输入录两次,得到的帧序列完全相同(可回放)。

测试用固定种子生成随机输入,所以每次运行检查的是同一批数据,结果可以复现。发现某一步演示不对,请通过页面底部的「微信咨询」告诉我们具体输入和第几步。

03

各演示的伪代码行数与复杂度

演示伪代码行数最好平均最坏额外空间
冒泡排序7O(n)O(n²)O(n²)O(1)
插入排序6O(n)O(n²)O(n²)O(1)
选择排序6O(n²)O(n²)O(n²)O(1)
归并排序8O(n log n)O(n log n)O(n log n)O(n)
快速排序7O(n log n)O(n log n)O(n²)O(log n) 平均,O(n) 最坏
堆排序9O(n log n)O(n log n)O(n log n)O(1)
顺序查找3O(1)O(n)O(n)O(1)
二分查找7O(1)O(log n)O(log n)O(1)
6O(1)O(1)O(1)O(n)
队列(循环队列)6O(1)O(1)O(1)O(n)
前序遍历5O(n)O(n)O(n)O(h)
中序遍历5O(n)O(n)O(n)O(h)
后序遍历5O(n)O(n)O(n)O(h)
层序遍历6O(n)O(n)O(n)O(w)
广度优先搜索(BFS)5O(V + E)O(V + E)O(V + E)O(V)
深度优先搜索(DFS)4O(V + E)O(V + E)O(V + E)O(V)
Dijkstra 最短路7O(V²)O(V²)O(V²)O(V)