📜  p5.js |快速排序(1)

📅  最后修改于: 2023-12-03 15:18:12.344000             🧑  作者: Mango

p5.js | 快速排序

简介

快速排序(Quicksort)是一种常用的排序算法,属于交换排序的一种。由于快速排序在大多数情况下具有稳定性好、效率高的特点,常常被采用用于排序领域。本文将介绍如何使用 p5.js 实现快速排序算法。

原理

快速排序的基本思想是选择一个基准元素,将序列中小于该基准元素的值放到左边,大于该基准元素的值放到右边,然后递归地重复该过程,直至整个序列有序。

快速排序的时间复杂度为 O(n*log(n)),但最坏情况下的时间复杂度为 O(n^2),因此为了避免最坏情况的出现,可以采用随机选择基准元素的方法。

实现
整体结构

我们可以把快速排序分为三个部分:

  1. 选择基准元素
  2. 划分序列,将小于基准元素的值放到左边,大于基准元素的值放到右边
  3. 对左右两部分递归排序

代码如下:

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  var pivotIndex = Math.floor(Math.random() * arr.length);
  var pivot = arr[pivotIndex];
  var less = [];
  var greater = [];
  for (var i = 0; i < arr.length; i++) {
    if (i === pivotIndex) {
      continue;
    }
    if (arr[i] < pivot) {
      less.push(arr[i]);
    } else {
      greater.push(arr[i]);
    }
  }
  return quickSort(less).concat([pivot], quickSort(greater));
}
绘制

为了方便观察快速排序的过程,我们可以使用 p5.js 来绘制序列,并在每一次划分后重新绘制序列。具体绘制过程如下:

var arr = [3, 7, 4, 9, 5, 2, 6, 1, 8];

function setup() {
  createCanvas(800, 600);
  frameRate(10);
}

function draw() {
  background(255);
  textSize(32);
  textAlign(CENTER, CENTER);
  for (var i = 0; i < arr.length; i++) {
    var x = map(i, 0, arr.length, 50, width - 50);
    var y = map(arr[i], 1, arr.length, 50, height - 50);
    text(arr[i], x, y);
  }
  arr = quickSort(arr);
}
运行

我们可以将上面的代码保存为 sketch.js 文件,并将它和 p5.js 的库文件一起放到一个文件夹中,在浏览器中打开 index.html 文件即可看到排序的过程。

效果

p5.js | 快速排序

总结

本文介绍了如何使用 p5.js 实现快速排序算法,并通过可视化的方式展示了排序的过程。需要注意的是,最坏情况下快速排序的时间复杂度为 O(n^2),因此在实际应用中需要采取一些方法来避免最坏情况的出现。