QuickSort is a Divide and Conquer algorithm. It picks an element as pivot and partitions the given array around the picked pivot. There are many different versions of quickSort that pick pivot in different ways.
- Always pick first element as pivot.
- Always pick last element as pivot.
- Pick a random element as pivot.
- Pick median as pivot.
Approach:
- Firstly take an array of random values.
- Draw rectangle side-by-side according to the values at that array’s index.
- Implement QuickSort Algorithm in p5.js.
- Assign time delays in order to visualise the changes made at each successive stage.
Example:
<!DOCTYPE html> < html >
< head >
< meta charset = "UTF-8" >
< title >QuickSort Sorting Algorithm</ title >
< script src =
type = "text/javascript" ></ script >
< style >
body {
padding: 0;
margin: 0;
}
canvas {
vertical-align: top;
}
</ style >
</ head >
< body >
< script type = "text/javascript" >
// Assign Global Values
let values = [];
let w = 20;
let states = [];
function setup() {
// Create Canvas of given Size
createCanvas(800, 500);
// Assign Array of Random Values
values = new Array(floor(width/w));
for(let i = 0; i < values.length ; i++) {
values[i] = float(random(height));
states[i] = -1;
}
// To print values to Browser's Console
print("Unsorted Array:" + values);
// Invoke QuickSort Function
quickSort(values, 0, values.length);
print("Sorted Array:" + values);
}
// Asynchronous Definition of Quick Sort Function
async function quickSort(arr, start, end) {
if(start >= end) {
return;
}
let index = await partition(arr, start, end);
states[index] = -1;
// Promise.all is used so that each function
// should invoke simultaneously
await Promise.all([quickSort(arr, start, index-1),
quickSort(arr, index+1, end)]);
}
// Asynchronous Definition of Partition Function
async function partition(arr, start, end) {
for(let i = start; i< end ; i++) {
states[i] = 1;
}
let pivotIndex = start ;
let pivotValue = arr [end];
states[pivotIndex] = 0;
for(let i = start ; i < end; i++) {
if(arr[i]<pivotValue) {
await swap(arr, i, pivotIndex);
states[pivotIndex] = -1;
pivotIndex++;
states[pivotIndex] = 0;
}
}
await swap(arr, pivotIndex, end);
for(let i = start ; i < end; i++) {
states[i] = -1;
}
return pivotIndex;
}
// Definition of Draw function
function draw() {
// Set Background Color
background(51);
for(let i = 0 ; i < values.length; i++) {
stroke(0);
fill(255);
if(states[i] == 0) {
// Pivot Element
fill(255, 0, 0);
}
else if (states[i]==1) {
// Sorting bar
fill("#58FA82");
}
else {
// Sorted Bars
fill(255);
}
rect(i*w, height - values[i], w, values[i]);
}
}
async function swap(arr, a, b) {
// Call to sleep function
await sleep(100);
let t = arr [a];
arr[a] = arr[b];
arr[b] = t;
}
// Definition of sleep function
function sleep(ms) {
return new Promise(resolve
=> setTimeout(resolve, ms));
}
</ script >
</ body >
</ html >
|
Output: