xxxxxxxxxx
150
const f = {
bogo:{
step:()=>{
rlist();
if(isSorted()) running = clock = false;
},
start:()=>{}
},
bogo2:{
step:()=>{
swapR();
if(isSorted()) running = clock = false;
},
start:()=>{}
},
bubble:{
step:()=>{
let bool = true;
for(let i = 0; i < (number-1); i++){
if(list[i] > list[i+1]){
algoF.swap(i);
bool = false;
}
}
if(bool) running = clock = false;
},
start:()=>{},
swap:(i)=>{
list[i] = [list[i+1], list[i+1] = list[i]][0];
}
},
cocktail:{
step:()=>{
let bool = true;
if(algoF.dir === 0){
for(let i = 0; i < (number-1); i++){
if(list[i] > list[i+1]){
algoF.swap(i,i+1);
bool = false;
}
}
algoF.dir = 1;
}else{
for(let i = (number-1); i > 0; i--){
if(list[i] < list[i-1]){
algoF.swap(i,i-1);
bool = false;
}
}
algoF.dir = 0;
}
if(bool) running = clock = false;
},
start:()=>{algoF.dir = 0},
swap:(i,j)=>{
list[i] = [list[j], list[j] = list[i]][0];
},
dir:0
},
cheat:{
step:()=>{
let bool = true;
for(let i = 0; i < number; i++){
if(list[i] !== (i+1)){
algoF.swap(i,list[i]-1);
bool = false;
}
}
if(bool) running = clock = false;
},
start:()=>{},
swap:(i,j)=>{
list[i] = [list[j], list[j] = list[i]][0];
}
}
};
let number = 100,
list = [],
algo = "bogo",
algoF = f[algo],
running = false,
clock = false;
function setup() {
createCanvas(400, 400);
rlist();
}
function draw() {
background(0);
list.forEach((v,i)=>{
fill(255,0,0); noStroke();
if(v === (i+1)) fill(0,255,0);
rect(i*width/number,width-v*width/number,width/number,v*width/number);
});
if(clock && running) algoF.step();
}
const changeAlgo = ()=>{
if(running) return;
const a = document.getElementById("algo");
algo = a.options[a.selectedIndex].value;
algoF = f[algo];
},
rlist = ()=>{
list = [];
for(let i = 1; i <= number; i++){
let r = floor(random(number));
while(list[r] !== undefined) r = floor(random(number));
list[r] = i;
}
},
swapR = ()=>{
let i = floor(random(number)), j = i;
do{
j = floor(random(number))
}while(j === i);
list[i] = [list[j], list[j] = list[i]][0];
return [i, j];
},
algoStep = ()=>{
if(clock) return;
if(!running){
running = true;
algoF.start();
}
algoF.step();
},
algoStart = ()=>{
if(clock) return;
if(!running){
running = true;
algoF.start();
}
clock = true;
},
algoStop = ()=>{
clock = false;
running = false;
},
algoFramerate = (fr)=>{
let nfr = parseInt(fr);
if(isNaN(fr)) return;
frameRate(nfr);
},
isSorted = ()=>{
for(let i = 0; i < (number-1); i++){
if(list[i] > list[i+1]) return false;
}
};