EGE 排序可视化演示, 支持自定义任意排序,内置经典排序算法

排序算法是计算机科学的基础内容之一。本项目通过 EGE 图形库实现了多种经典排序算法的可视化演示,让抽象的算法过程变得直观可见。程序支持 11 种常见排序算法,包括冒泡排序、快速排序、归并排序等,并实时显示算法执行过程、操作统计和时间消耗。

本案例是基于 EGE 的排序可视化演示, 很多新生初学编程都会接触到各种排序算法, 这里使用 EGE 对于排序算法内部怎么运作的进行一个可视化的演示, 方便大家理解。

话不多说, 直接看图:

还有视频:

 

Github 页面:  https://github.com/wysaid/xege/pull/284(本案例的全部源码在文章末尾, 可滑到最下方直接查看)

项目特性

  • 11 种排序算法:冒泡、选择、插入、快速、归并、堆、希尔、基数、计数排序以及标准库排序
  • 实时可视化:通过柱状图展示数组状态,高亮显示当前比较和交换的元素
  • 操作统计:实时统计算法的写入/赋值次数、比较次数、读取次数
  • 速度控制:支持动态调整动画速度,方便观察不同算法的执行过程
  • 交互操作:支持算法切换、数组打乱、自动演示等多种交互方式
  • 性能对比:显示每个算法的时间复杂度和实际执行时间

可视化设计

视觉元素

程序使用柱状图表示数组元素,每个柱子的高度对应元素值的大小。通过颜色区分不同状态:

  • 浅蓝色:普通元素
  • 红色:当前正在访问或比较的第一个元素
  • 黄色:当前正在比较的第二个元素

信息显示

界面顶部实时显示:

  • 当前算法名称
  • 操作统计(写入/赋值、比较、读取次数)
  • 动画速度设置
  • 算法时间复杂度和空间复杂度

核心技术实现

1. 自定义元素类 MyElement

为了实现操作统计和可视化触发,程序封装了自定义的 MyElement 类:

这个设计的巧妙之处在于:

  • 运算符重载:通过重载赋值、比较等运算符,自动统计操作次数
  • 静态计数器:使用静态成员变量全局统计,避免传递额外参数
  • 延迟机制:每次操作后延迟指定时间,使可视化过程清晰可见

2. 自定义迭代器 MyIterator

为了让标准库算法也能触发可视化,程序实现了符合 STL 标准的自定义迭代器:

关键特性

  • 随机访问迭代器:实现了完整的随机访问迭代器接口
  • 操作拦截:在解引用和下标访问时触发可视化
  • STL 兼容:可以直接用于 std::sortstd::stable_sort 等标准库算法

3. 特化 std::swapstd::iter_swap

为了统计交换操作,程序特化了标准库的交换函数:

这确保了即使使用标准库的交换函数,也能正确统计和可视化。

排序算法实现

冒泡排序

  • 时间复杂度O(n^2)
  • 空间复杂度O(1)
  • 特点:每次遍历将最大元素”冒泡”到末尾

快速排序

  • 时间复杂度:平均 O(n \log n),最坏 O(n^2)
  • 空间复杂度O(\log n)(递归栈)
  • 特点:分治算法,通过基准元素分区实现排序

归并排序

  • 时间复杂度O(n \log n)
  • 空间复杂度O(n)
  • 特点:稳定排序,通过分治和合并实现

堆排序

堆排序手动实现了堆化过程,与自定义迭代器完美配合:

  • 时间复杂度O(n \log n)
  • 空间复杂度O(1)
  • 特点:原地排序,不稳定

基数排序

基数排序针对整数特点,按位进行排序:

  • 时间复杂度O(d \cdot (n + k)),其中 d 是位数
  • 空间复杂度O(n + k)
  • 特点:非比较排序,适合整数

EGE 图形库应用

1. 柱状图绘制

2. 实时信息显示

3. 键盘交互

操作指南

  • S / 空格 / 回车:开始排序当前算法
  • R / ESC:重新打乱数组
  • ← / →:切换算法
  • A:自动演示所有算法
  • + / =:加速动画
  • – / _:减速动画
  • ESC(排序中):中断排序

技术亮点

  1. 泛型设计:使用 C++ 模板,所有算法统一接口
  2. STL 兼容:自定义迭代器完全符合 STL 标准
  3. 操作拦截:通过运算符重载自动统计操作
  4. 实时反馈:每次操作都触发可视化更新
  5. 跨平台文本:通过宏定义支持中英文界面

性能分析

程序不仅可视化排序过程,还提供详细的性能数据:

算法 时间复杂度 空间复杂度 稳定性
冒泡排序 O(n^2) O(1) 稳定
选择排序 O(n^2) O(1) 不稳定
插入排序 O(n^2) O(1) 稳定
快速排序 O(n \log n) O(\log n) 不稳定
归并排序 O(n \log n) O(n) 稳定
堆排序 O(n \log n) O(1) 不稳定
希尔排序 O(n^{1.3}) O(1) 不稳定
基数排序 O(d \cdot n) O(n + k) 稳定
计数排序 O(n + k) O(k) 稳定

教育价值

这个项目非常适合:

  • 算法学习:直观理解各种排序算法的工作原理
  • 性能对比:实时对比不同算法的效率差异
  • 代码设计:学习泛型编程、迭代器设计、运算符重载等 C++ 高级特性
  • 可视化技术:掌握如何将抽象算法转化为直观的图形展示

通过这个项目,你不仅能理解排序算法本身,还能学习如何优雅地设计可扩展的程序架构,以及如何利用 EGE 图形库实现专业的数据可视化效果。

下面是完整代码,复制下面的代码, 在配置好 ege 的 C++ 编译器里面运行就能看到整体效果哦。

 

 

文章分类 范例 标签: , , ,