🚥排序算法可视化 - 冒泡、快排、归并、堆排序动画演示
用柱状图动画直观理解排序算法。内置 14 种算法:冒泡、鸡尾酒、梳排序、选择、插入、希尔(Ciura 间隔)、归并、快速排序(Lomuto 与 Hoare 两种分区)、堆排序、计数排序、LSD 基数排序、桶排序和简化版 Timsort。每个算法都写成生成器,每做一次比较、交换或写入就产生一个事件,动画按事件逐一重放,所以看到的每一步都和真实代码完全一致:黄色表示正在比较,红色表示交换或写入,蓝色表示读取,排完后绿色扫过。可以调节数组大小(最多 1000 个元素)、输入数据(随机、已排序、逆序、基本有序、少量不同值)和播放速度,也能暂停后单步执行;面板实时统计比较次数、交换次数、写入次数和总步数。开启声音后,音高随当前元素的数值变化,能“听”出算法的节奏。赛跑模式让 2~4 个算法在同一份数据上同时运行,按完成顺序排名,直观对比 O(n²) 与 O(n log n) 的差距,以及快排在少量不同值时的表现。页面下方附有各算法最好、平均、最坏时间复杂度、额外空间和稳定性的对照表。
免费 · 无需注册 · 浏览器本地处理最后更新:
正在加载工具...
如何使用排序算法可视化
- 1选择算法(或切换到赛跑模式选 2~4 个算法),设置数组大小和输入数据
- 2点击播放观看动画,调节速度,或暂停后单步执行
- 3对比比较 / 交换 / 写入次数和完成顺序,查看下方复杂度表
常见问题
- 哪种排序算法最快?
- 没有在所有情况下都最快的算法。对随机数据,快速排序、归并排序和堆排序都是 O(n log n),其中快排的常数最小,通常最快;对基本有序的数据,插入排序和 Timsort 接近 O(n);值域较小的整数用计数排序或基数排序可以做到线性时间。可以在赛跑模式里换不同的输入数据,亲眼看看它们的差别。
- Lomuto 和 Hoare 两种快排分区有什么区别?
- Lomuto 分区以末尾元素为基准,从左到右扫描,把小于基准的元素依次交换到前面,写法简单但交换次数较多,遇到大量重复值时容易退化。Hoare 分区用左右两个指针相向扫描,遇到逆序对才交换,交换次数通常不到 Lomuto 的一半,对重复值也更稳健。本工具的 Lomuto 版本用了三数取中,避免已排序输入退化成 O(n²)。
- 什么是稳定排序?
- 稳定排序保证相等的元素在排序后保持原来的先后顺序。比如先按姓名排好的名单再按成绩做稳定排序,同分的人仍然按姓名排列。归并、插入、冒泡、计数、基数和 Timsort 是稳定的;快速排序、堆排序、选择排序和希尔排序不稳定。
- 为什么计数排序和基数排序的比较次数是 0?
- 它们不是靠两两比较来排序的:计数排序统计每个值出现了多少次再按顺序写回,基数排序按个位、十位……逐位分桶。因此它们不受基于比较的排序 Ω(n log n) 下界的限制,在值域或位数不大时能达到线性时间,代价是额外的内存和读写次数,这些都显示在统计里。