排序算法

初中计算机科学确定性的比较排序轨迹;主数组写入次数单独统计

准备排序

11091325374451061278829110611

橙色标记表示此操作涉及的位置。索引从零开始。使用“上一步”和“步进”查看每项操作。

关于此实验

观察冒泡排序、插入排序和归并排序如何将相同输入转换为升序。你可以在比较时暂停,逐步查看每次写入,也可以沿着完整轨迹向后移动。分别统计值比较次数和主数组写入次数,有助于区分算法的工作量与动画播放时长。

学习目标

  • 追踪三种比较排序算法中的比较和写入
  • 比较算法在乱序、已排序和逆序输入上的性能
  • 区分最坏情况下的二次增长与 n log n 增长

使用方法

  1. 1固定乱序输入和数组长度。运行完冒泡排序,并记录比较次数和写入次数。
  2. 2使用相同输入重新运行插入排序,然后运行归并排序。比较最终计数。
  3. 3尝试已排序的输入,观察冒泡排序的提前退出以及插入排序较少的比较次数。
  4. 4使用“Previous”和轨迹滑块查看合并过程。临时缓冲区可以保存那些在原主数组位置上已不可见的值。

模型

冒泡排序最坏情况下的值比较次数
插入排序和归并排序最坏情况下的时间增长
一次交换按对主数组进行两次写入计算

假设

  • 输入包含从 1 到 n 的不重复整数。打乱数据时使用固定种子,因此每种算法接收的数据都相同。
  • 比较是对数据值进行测试,而不是测试索引或循环边界。写入是指向主数组赋值,包括未发生变化的插入键。
  • 归并排序复制到临时缓冲区的操作不计入写入次数。额外内存使用量也不计入显示的操作总数。
  • 播放速度是为教学目的设置的,并非实际运行时间性能基准。

在课堂上试试这个实验

  1. Q1在此实现中,对于已经排好序的输入,为什么冒泡排序只需进行 n − 1 次比较?
  2. Q2数组长度相同时,对于逆序输入,哪种算法的比较次数更少?
  3. Q3为什么动画帧数不能可靠地衡量算法速度?

常见问题

为什么在插入排序或归并排序过程中,值会短暂地重复显示?

覆盖主数组时,某个值可能暂存在临时键或归并缓冲区中。可视化会在每次写入时显示主数组的内容;操作完成后,重复现象就会消失。

归并排序总是写入次数更少吗?

不是。归并排序的比较次数增长较为高效,但会反复将归并结果写回。操作次数取决于输入数据,以及具体统计哪些赋值操作。