xxxxxxxxxx
114
let numbers = [12, 5, 8, 20, 15, 3];
let groups = [];
let currentStep = 0;
let visualization = [];
let lineLength = 100;
function setup() {
createCanvas(800, 600);
textSize(16);
frameRate(2);
// Step 1: Initialize groups
initializeGroups(numbers);
}
function draw() {
background(255);
if (currentStep < visualization.length) {
visualizeStep(visualization[currentStep]);
currentStep++;
} else {
noLoop(); // Stop the animation when all steps are completed
}
}
function initializeGroups(arr) {
// Create initial 2-number groups
let groupSize = 2;
for (let i = 0; i < arr.length; i += groupSize) {
let group = arr.slice(i, i + groupSize);
groups.push(group);
}
// Step 2: Apply Bogosort and calculate averages
let stepData = [];
for (let group of groups) {
let sortedGroup = bogosort(group.slice());
let avg = (sortedGroup[0] + sortedGroup[1]) / 2;
stepData.push({ group: sortedGroup, avg: avg });
}
visualization.push(stepData);
// Step 3: Group averages
let averages = stepData.map(data => data.avg);
let newGroups = [];
for (let i = 0; i < averages.length; i += 2) {
let group = averages.slice(i, i + 2);
newGroups.push(group);
}
// Apply Bogosort to the new groups
stepData = [];
for (let group of newGroups) {
if (group.length == 1) {
stepData.push({ group: group, avg: group[0] });
} else {
let sortedGroup = bogosort(group.slice());
let avg = (sortedGroup[0] + sortedGroup[1]) / 2;
stepData.push({ group: sortedGroup, avg: avg });
}
}
visualization.push(stepData);
// Final averages
let finalAverages = stepData.map(data => data.avg);
visualization.push(finalAverages);
}
function bogosort(arr) {
while (!isSorted(arr)) {
shuffle(arr);
drawRandomLines(arr);
}
return arr;
}
function isSorted(arr) {
for (let i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1]) return false;
}
return true;
}
function shuffle(arr) {
for (let i = arr.length - 1; i > 0; i--) {
let j = floor(random(i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
function drawRandomLines(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let x1 = map(arr[i], 0, 20, 50, width - 50);
let x2 = map(arr[i + 1], 0, 20, 50, width - 50);
let y = random(height / 2);
stroke(0, 100, 255, 150);
line(x1, y, x2, y);
}
}
function visualizeStep(stepData) {
let yOffset = 50;
for (let data of stepData) {
let groupStr = data.group.join(', ');
text(`Group: ${groupStr}`, 50, yOffset);
yOffset += 20;
let avgStr = `Average: ${data.avg.toFixed(2)}`;
text(avgStr, 50, yOffset);
yOffset += 40;
}
}