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: