165 lines
4 KiB
JavaScript
165 lines
4 KiB
JavaScript
const numBars = 100;
|
|
const barWidth = 20;
|
|
const maxBarHeight = 200;
|
|
const barColor = [255, 127, 127];
|
|
const barSpacing = 5;
|
|
const swapRate = 10;
|
|
let oldBars = [];
|
|
let osc;
|
|
|
|
function isSorted(arr) {
|
|
for (let i = 0; i < arr.length - 1; i++) {
|
|
if (arr[i] > arr[i + 1]) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function refreshBars(p, bars) {
|
|
const barX = (i) => i * (barWidth + barSpacing) + barSpacing;
|
|
p.clear();
|
|
p.background(10);
|
|
for (let i = 0; i < numBars; i++) {
|
|
p.fill(barColor);
|
|
p.rect(barX(i), p.height - bars[i], barWidth, bars[i]);
|
|
}
|
|
diffIndexArray = bars
|
|
.map((val, i) => (val !== oldBars[i] ? i : -1))
|
|
.filter((i) => i !== -1);
|
|
for (bar of diffIndexArray) {
|
|
p.fill(180, 0, 180);
|
|
p.rect(barX(bar), p.height - bars[bar], barWidth, bars[bar]);
|
|
}
|
|
oldBars = [...bars];
|
|
}
|
|
|
|
const sketch = function (p) {
|
|
let bars = [];
|
|
p.setup = function () {
|
|
p.createCanvas(
|
|
numBars * (barWidth + barSpacing) + barSpacing,
|
|
maxBarHeight * 1.25
|
|
);
|
|
p.background(10);
|
|
for (let i = 0; i < numBars; i++) {
|
|
bars[i] = p.random(10, maxBarHeight);
|
|
}
|
|
oldBars = [...bars];
|
|
p.noLoop();
|
|
p.userStartAudio();
|
|
osc = new p5.Oscillator("sine");
|
|
executeSortingFunction("insertionSort", bars, p);
|
|
};
|
|
};
|
|
|
|
function mousePressed() {
|
|
console.log(p.getAudioContext());
|
|
userStartAudio();
|
|
console.log(p.getAudioContext());
|
|
}
|
|
|
|
async function executeSortingFunction(functionAsString, bars, p) {
|
|
switch (functionAsString) {
|
|
case "bogoSort":
|
|
await bogoSort(bars, p);
|
|
break;
|
|
case "bozoSort":
|
|
await bozoSort(bars, p);
|
|
break;
|
|
case "stalinSort":
|
|
await stalinSort(bars, p);
|
|
break;
|
|
case "bubbleSort":
|
|
await bubbleSort(bars, p);
|
|
break;
|
|
case "insertionSort":
|
|
await insertionSort(bars, p);
|
|
break;
|
|
}
|
|
refreshBars(p, bars);
|
|
p.colorMode(p.HSL);
|
|
osc.start();
|
|
for (let i = 0; i < bars.length; i++) {
|
|
p.fill((i / bars.length) * 360, 100, 50);
|
|
p.rect(
|
|
i * (barWidth + barSpacing) + barSpacing,
|
|
p.height - bars[i],
|
|
barWidth,
|
|
bars[i]
|
|
);
|
|
osc.freq(((bars[i] * maxBarHeight) / 20 ) + 500);
|
|
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
}
|
|
osc.stop();
|
|
}
|
|
|
|
async function bogoSort(arr, p) {
|
|
while (!isSorted(arr)) {
|
|
for (let i = arr.length - 1; i > 0; i--) {
|
|
// Fisher-Yates-Shuffle
|
|
const j = Math.floor(Math.random() * (i + 1));
|
|
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
}
|
|
refreshBars(p, arr);
|
|
await new Promise((resolve) => setTimeout(resolve, swapRate));
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
async function bozoSort(arr, p) {
|
|
while (!isSorted(arr)) {
|
|
const bar1 = Math.floor(Math.random() * arr.length);
|
|
const bar2 = Math.floor(Math.random() * arr.length);
|
|
[arr[bar1], arr[bar2]] = [arr[bar2], arr[bar1]];
|
|
refreshBars(p, arr);
|
|
await new Promise((resolve) => setTimeout(resolve, swapRate));
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
async function stalinSort(arr, p) {
|
|
for (let i = 0; i < arr.length; i++) {
|
|
if (arr[i] < arr[i - 1]) {
|
|
arr.splice(i, 1);
|
|
i -= 1;
|
|
refreshBars(p, arr);
|
|
await new Promise((resolve) => setTimeout(resolve, swapRate));
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
async function bubbleSort(arr, p) {
|
|
while (!isSorted(arr)) {
|
|
for (let i = 0; i < arr.length; i++) {
|
|
if (arr[i] > arr[i + 1]) {
|
|
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
|
|
refreshBars(p, arr);
|
|
await new Promise((resolve) => setTimeout(resolve, swapRate));
|
|
}
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
async function insertionSort(arr, p) {
|
|
for (let i = 0; i <= arr.length - 1; i++) {
|
|
let currentBarIndex = i;
|
|
while (
|
|
currentBarIndex > 0 &&
|
|
arr[currentBarIndex - 1] > arr[currentBarIndex]
|
|
) {
|
|
[arr[currentBarIndex], arr[currentBarIndex - 1]] = [
|
|
arr[currentBarIndex - 1],
|
|
arr[currentBarIndex],
|
|
];
|
|
currentBarIndex--;
|
|
refreshBars(p, arr);
|
|
await new Promise((resolve) => setTimeout(resolve, swapRate));
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
const sketch2 = function (p) {};
|
|
|
|
p5Sketch = new p5(sketch);
|