Open In App

p5.js | Quick Sort

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.

Approach:

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:


Article Tags :