返回

动态可视化:用Canvas与requestAnimationFrame揭秘冒泡排序算法

前端

一、认识冒泡排序算法

冒泡排序算法是一种简单的排序算法,因其形象的比喻而得名。它通过重复地比较相邻的元素,并交换那些不按顺序的元素,最终将整个数组排序。

1. 算法流程:

  1. 从数组的第一个元素开始,将其与相邻的第二个元素进行比较。
  2. 如果第一个元素大于第二个元素,则交换这两个元素的位置。
  3. 继续比较相邻的元素,并交换那些不按顺序的元素。
  4. 重复步骤2和步骤3,直到数组中的所有元素都按顺序排列。

2. 算法特点:

  • 时间复杂度:O(n^2),最坏情况和平均情况下的时间复杂度相同。
  • 空间复杂度:O(1),算法不使用额外的空间。
  • 稳定性:冒泡排序算法是稳定的,即在排序后,如果两个元素的初始顺序相等,则排序后的顺序也相等。

二、在Canvas上可视化冒泡排序算法

借助Canvas和requestAnimationFrame,我们可以将冒泡排序算法的可视化演示出来。

1. 准备工作:

  • 创建一个HTML文件和一个JavaScript文件。
  • 在JavaScript文件中,导入requestAnimationFrame库。
  • 在HTML文件中,创建Canvas元素。

2. 编写JavaScript代码:

// 创建Canvas上下文
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// 定义数组
const array = [5, 3, 8, 2, 1, 4, 7, 6];

// 定义颜色
const colors = ["#ff0000", "#ff8000", "#ffff00", "#80ff00", "#00ff00", "#00ff80", "#00ffff", "#0080ff"];

// 定义正在比较的元素的索引
let i = 0;
let j = 1;

// 定义是否正在交换元素的标志
let isSwapping = false;

// 定义排序是否完成的标志
let isSorted = false;

// 定义动画帧ID
let requestId = null;

// 循环播放动画
function animate() {
  // 清除Canvas
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制数组元素
  for (let i = 0; i < array.length; i++) {
    ctx.fillStyle = colors[i];
    ctx.fillRect(i * 50, 0, 50, array[i] * 50);
  }

  // 比较相邻元素
  if (!isSwapping && !isSorted) {
    if (array[i] > array[j]) {
      isSwapping = true;
    } else {
      i++;
      j++;
    }

    if (j === array.length) {
      j = 0;
      i = 0;
      isSorted = true;
    }
  }

  // 交换元素
  if (isSwapping) {
    let temp = array[i];
    array[i] = array[j];
    array[j] = temp;
    isSwapping = false;
  }

  // 检查是否排序完成
  if (isSorted) {
    cancelAnimationFrame(requestId);
    return;
  }

  // 请求下一次动画帧
  requestId = requestAnimationFrame(animate);
}

// 启动动画
animate();

三、运行效果:

当您运行JavaScript代码时,您将在Canvas上看到冒泡排序算法的可视化演示。数组中的元素将根据冒泡排序算法的步骤进行排序。

四、总结

本文通过Canvas和requestAnimationFrame来可视化冒泡排序算法的执行过程,帮助您直观地理解这一经典排序算法的工作原理。我们不仅提供了详细的JavaScript代码,还包含了清晰的思路分析和示例,让您对冒泡排序算法有更深入的认识。