//the number of items to sort
const ITEMS = 20;
//variables to control the delays
const DELAY_RESTART = 5000;
const DELAY_STEP = 1000;
//the list of items to be sorted
let list = new Array(ITEMS);
let operation_count = 0;
//the list of how many times a number occured
let count = [];
//define each individual element
let min = Math.min(list);
let max = Math.max(list);
//let operation_count_box = document.getElementById('operations');
let canvas_org = document.getElementById('originalList');
let context_org = canvas_org.getContext('2d');
let canvas_org_update_bg = true;
let canvas_org_update_bar = true;
/*
let canvas_count = document.getElementById('countList');
let canvas_count_update_bg = true;
let canvas_count_update_bar = true;
let context_count = canvas_count.getContext('2d');
let canvas_sort = document.getElementById('sortedList');
let canvas_sort_update_bg = true;
let canvas_sort_update_bar = true;
let context_sort = canvas_sort.getContext('2d');
*/
let sort_started = false;
let sort_finished = false;
function setupCanvas() {
// Setup event listeners for load and window resize.
window.addEventListener('load', canvasResize);
window.addEventListener('resize', canvasResize);
}
function canvasResize() {
canvas_org.width = window.innerWidth;
canvas_org.height = window.innerHeight;
canvas_org_update_bg = true;
canvas_org_update_bar = true;
/*
canvas_count.width = window.innerWidth;
canvas_count.height = window.innerHeight/5;
canvas_count_update_bg = true;
canvas_count_update_bar = true;
canvas_sort.width = window.innerWidth;
canvas_sort.height = window.innerHeight/5;
canvas_sort_update_bg = true;
canvas_sort_update_bar = true;
*/
}
//not currently drawing bars
function drawBars(canvas, context){
let length = list.length;
let barWidth = canvas.width / length;
let barScale = canvas.height / max;
for (let i = 0; i < ITEMS; i++) {
let x = i * barWidth;
let h = list[i] * barScale;
let y = canvas.height - h;
context.save();
if (i == temp)
context.fillStyle = 'white';
else
context.fillStyle = 'orange';
context.fillRect(x+1, y, barWidth-2, h);
context.restore();
}
}
// Draws the black background.
function drawBackground(canvas, context){
// Save context to stack.
context.save();
context.fillStyle = 'black';
context.fillRect(0, 0, canvas.width, canvas.height);
// Pops most recently saved canvas state off stack.
context.restore();
context.fillStyle = 'grey';
context.font = "30px Ariel";
context.fillText("Counting Sort", + ITEMS + "numbers", 30, 25);
}
let state = 0;
let temp = min;
let temp2 = 0;
function countingSort(){
if(state == 0){
if(temp <= max){
count[temp] = 0;
temp++;
}
if(temp > max){
state = 1;
temp = 0;
}
canvas_org_update_bg = true;
canvas_org_update_bar = true;
return;
}
if(state == 1){
if(temp < list.length){
count[list[temp]]++;
temp++;
}
if(temp == list.length){
state = 2;
temp = min;
}
canvas_count_update_bg = true;
canvas_count_update_bar = true;
return;
}
if(state == 2){
if(temp <= max){
if(count[temp] > 0){
list[temp2] = temp;
temp2++;
count[temp]--;
}
temp++;
}
if(temp > max){
state = 0;
temp = min;
temp2 = 0;
sort_finished = true;
}
canvas_sort_update_bg = true;
canvas_sort_update_bar = true;
return;
}
}
//initializes the list to ITEMS length
function initList(){
for(let i=0; i<ITEMS; i++){
list[i] = Math.round(Math.random() * 100);
}
operation_count = 0;
// operation_count_box.innerHTML = "0";
}
// block_loop is briefly enabled when sorting has finished
let block_loop = false;
function step() {
if (!block_loop) {
// If background needs updated, redraw background.
if (canvas_org_update_bg) {
canvas_org_update_bg = false;
drawBackground(canvas_org, context_org);
console.log("here");
}
/*
if (canvas_count_update_bg) {
canvas_count_update_bg = false;
drawBackground(canvas_count, context_count);
}
if (canvas_sort_update_bg) {
canvas_sort_update_bg = false;
drawBackground(canvas_sort, context_sort);
}
*/
// If bars need updated, replot.
if (canvas_org_update_bar) {
canvas_org_update_bar = false;
drawBars(canvas_org, context_org);
console.log("here2");
}
/*
if (canvas_count_update_bar) {
canvas_count_update_bar = false;
drawBars(canvas_count, context_count);
}
if (canvas_sort_update_bar) {
canvas_sort_update_bar = false;
drawBars(canvas_sort, context_sort);
}
*/
// Starts the sort if it isn't looping already.
if (!sort_started){
console.log("here3");
countingSort();
}
// Checks if sort has completed. Briefly blocks loop
if (sort_finished) {
console.log("here4");
block_loop = true;
setTimeout(function() {
initList();
sort_started = false;
sort_finished = false;
block_loop = false;
}, DELAY_RESTART);
}
}
}
function setup() {
initList();
}
// Main function which runs the setup and holds the main loop
(function main() {
// Setup the canvas and list.
setup();
(function mainLoop() {
step();
// requestAnimationFrame calls mainLoop infinitely
requestAnimationFrame(mainLoop);
})();
})();