Skip to content
Related Articles

Related Articles

Improve Article

p5.js | Quick Sort

  • Difficulty Level : Medium
  • Last Updated : 09 Jul, 2019

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:

Hey geek! The constant emerging technologies in the world of web development always keeps the excitement for this subject through the roof. But before you tackle the big projects, we suggest you start by learning the basics. Kickstart your web development journey by learning JS concepts with our JavaScript Course. Now at it’s lowest price ever!




My Personal Notes arrow_drop_up
Recommended Articles
Page :