Iterative Quick Sort - GeeksforGeeks

06 Sep, 2021
Following is a typical recursive implementation of Quick Sort that uses last element as pivot.  
C++
Java
Python3
C#
PHP
Javascript
// CPP code for recursive function of Quicksort#include <bits/stdc++.h> using namespace std; // Function to swap numbersvoid swap(int* a, int* b){    int temp = *a;    *a = *b;    *b = temp;} /* This function takes last element as pivot,   places the pivot element at its correct   position in sorted  array, and places   all smaller (smaller than pivot) to left   of pivot and all greater elements to   right of pivot */int partition(int arr[], int l, int h){    int x = arr[h];    int i = (l - 1);     for (int j = l; j <= h - 1; j++) {        if (arr[j] <= x) {            i++;            swap(&arr[i], &arr[j]);        }    }    swap(&arr[i + 1], &arr[h]);    return (i + 1);} /* A[] --> Array to be sorted,l --> Starting index,h --> Ending index */void quickSort(int A[], int l, int h){    if (l < h) {        /* Partitioning index */        int p = partition(A, l, h);        quickSort(A, l, p - 1);        quickSort(A, p + 1, h);    }} // Driver codeint main(){     int n = 5;    int arr[n] = { 4, 2, 6, 9, 2 };     quickSort(arr, 0, n - 1);     for (int i = 0; i < n; i++) {        cout << arr[i] << " ";    }     return 0;}
// Java program for implementation of QuickSortimport java.util.*; class QuickSort {    /* This function takes last element as pivot,    places the pivot element at its correct    position in sorted array, and places all    smaller (smaller than pivot) to left of    pivot and all greater elements to right    of pivot */    static int partition(int arr[], int low, int high)    {        int pivot = arr[high];        int i = (low - 1); // index of smaller element        for (int j = low; j <= high - 1; j++) {            // If current element is smaller than or            // equal to pivot            if (arr[j] <= pivot) {                i++;                 // swap arr[i] and arr[j]                int temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }         // swap arr[i+1] and arr[high] (or pivot)        int temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;         return i + 1;    }     /* The main function that implements QuickSort()    arr[] --> Array to be sorted,    low --> Starting index,    high --> Ending index */    static void qSort(int arr[], int low, int high)    {        if (low < high) {            /* pi is partitioning index, arr[pi] is            now at right place */            int pi = partition(arr, low, high);             // Recursively sort elements before            // partition and after partition            qSort(arr, low, pi - 1);            qSort(arr, pi + 1, high);        }    }     // Driver code    public static void main(String args[])    {         int n = 5;        int arr[] = { 4, 2, 6, 9, 2 };         qSort(arr, 0, n - 1);         for (int i = 0; i < n; i++) {            System.out.print(arr[i] + " ");        }    }}
# A typical recursive Python# implementation of QuickSort # Function takes last element as pivot,# places the pivot element at its correct# position in sorted array, and places all# smaller (smaller than pivot) to left of# pivot and all greater elements to right# of pivotdef partition(arr, low, high):    i = (low - 1)         # index of smaller element    pivot = arr[high]     # pivot     for j in range(low, high):         # If current element is smaller        # than or equal to pivot        if arr[j] <= pivot:                     # increment index of            # smaller element            i += 1            arr[i], arr[j] = arr[j], arr[i]     arr[i + 1], arr[high] = arr[high], arr[i + 1]    return (i + 1) # The main function that implements QuickSort# arr[] --> Array to be sorted,# low --> Starting index,# high --> Ending index # Function to do Quick sortdef quickSort(arr, low, high):    if low < high:         # pi is partitioning index, arr[p] is now        # at right place        pi = partition(arr, low, high)         # Separately sort elements before        # partition and after partition        quickSort(arr, low, pi-1)        quickSort(arr, pi + 1, high) # Driver Codeif __name__ == '__main__' :         arr = [4, 2, 6, 9, 2]    n = len(arr)         # Calling quickSort function    quickSort(arr, 0, n - 1)         for i in range(n):        print(arr[i], end = " ")
// C# program for implementation of// QuickSortusing System; class GFG {     /* This function takes last element    as pivot, places the pivot element    at its correct position in sorted    array, and places all smaller    (smaller than pivot) to left of    pivot and all greater elements to    right of pivot */    static int partition(int[] arr,                         int low, int high)    {        int temp;        int pivot = arr[high];         // index of smaller element        int i = (low - 1);        for (int j = low; j <= high - 1; j++) {             // If current element is            // smaller than or            // equal to pivot            if (arr[j] <= pivot) {                i++;                 // swap arr[i] and arr[j]                temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }         // swap arr[i+1] and arr[high]        // (or pivot)        temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;         return i + 1;    }     /* The main function that implements    QuickSort() arr[] --> Array to be    sorted,    low --> Starting index,    high --> Ending index */    static void qSort(int[] arr, int low,                      int high)    {        if (low < high) {            /* pi is partitioning index,            arr[pi] is now at right place */            int pi = partition(arr, low, high);             // Recursively sort elements            // before partition and after            // partition            qSort(arr, low, pi - 1);            qSort(arr, pi + 1, high);        }    }     // Driver code    public static void Main()    {         int n = 5;        int[] arr = { 4, 2, 6, 9, 2 };         qSort(arr, 0, n - 1);         for (int i = 0; i < n; i++)            Console.Write(arr[i] + " ");    }} // This code is contributed by nitin mittal.
<?php// PHP code for recursive function// of Quicksort // Function to swap numbersfunction swap(&$a, &$b){    $temp = $a;    $a = $b;    $b = $temp;} /* This function takes last element as pivot,places the pivot element at its correctposition in sorted array, and placesall smaller (smaller than pivot) to leftof pivot and all greater elements toright of pivot */function partition (&$arr, $l, $h){    $x = $arr[$h];    $i = ($l - 1);     for ($j = $l; $j <= $h - 1; $j++)    {        if ($arr[$j] <= $x)        {            $i++;            swap ($arr[$i], $arr[$j]);        }    }    swap ($arr[$i + 1], $arr[$h]);    return ($i + 1);} /* A[] --> Array to be sorted,l --> Starting index,h --> Ending index */function quickSort(&$A, $l, $h){    if ($l < $h)    {        /* Partitioning index */        $p = partition($A, $l, $h);        quickSort($A, $l, $p - 1);        quickSort($A, $p + 1, $h);    }     } // Driver code$n = 5;$arr = array(4, 2, 6, 9, 2); quickSort($arr, 0, $n - 1); for($i = 0; $i < $n; $i++){    echo $arr[$i] . " ";} // This code is contributed by// rathbhupendra?>
<script>     // JavaScript program for implementation of QuickSort         /* This function takes last element    as pivot, places the pivot element    at its correct position in sorted    array, and places all smaller    (smaller than pivot) to left of    pivot and all greater elements to    right of pivot */    function partition(arr, low, high)    {        let temp;        let pivot = arr[high];           // index of smaller element        let i = (low - 1);        for (let j = low; j <= high - 1; j++) {               // If current element is            // smaller than or            // equal to pivot            if (arr[j] <= pivot) {                i++;                   // swap arr[i] and arr[j]                temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }           // swap arr[i+1] and arr[high]        // (or pivot)        temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;           return i + 1;    }       /* The main function that implements    QuickSort() arr[] --> Array to be    sorted,    low --> Starting index,    high --> Ending index */    function qSort(arr, low, high)    {        if (low < high) {            /* pi is partitioning index,            arr[pi] is now at right place */            let pi = partition(arr, low, high);               // Recursively sort elements            // before partition and after            // partition            qSort(arr, low, pi - 1);            qSort(arr, pi + 1, high);        }    }         let n = 5;    let arr = [ 4, 2, 6, 9, 2 ];     qSort(arr, 0, n - 1);     for (let i = 0; i < n; i++)      document.write(arr[i] + " ");   </script>
Output:  
2 2 4 6 9
The above implementation can be optimized in many ways1) The above implementation uses the last index as a pivot. This causes worst-case behavior on already sorted arrays, which is a commonly occurring case. The problem can be solved by choosing either a random index for the pivot or choosing the middle index of the partition or choosing the median of the first, middle, and last element of the partition for the pivot. (See this for details)2) To reduce the recursion depth, recur first for the smaller half of the array, and use a tail call to recurse into the other. 3) Insertion sort works better for small subarrays. Insertion sort can be used for invocations on such small arrays (i.e. where the length is less than a threshold t determined experimentally). For example, this library implementation of Quicksort uses insertion sort below size 7. Despite the above optimizations, the function remains recursive and uses function call stack to store intermediate values of l and h. The function call stack stores other bookkeeping information together with parameters. Also, function calls involve overheads like storing activation records of the caller function and then resuming execution. The above function can be easily converted to an iterative version with the help of an auxiliary stack. Following is an iterative implementation of the above recursive code.  
C++
C
Java
Python
C#
PHP
Javascript
// An iterative implementation of quick sort#include <bits/stdc++.h>using namespace std; // A utility function to swap two elementsvoid swap(int* a, int* b){    int t = *a;    *a = *b;    *b = t;} /* This function is same in both iterative and recursive*/int partition(int arr[], int l, int h){    int x = arr[h];    int i = (l - 1);     for (int j = l; j <= h - 1; j++) {        if (arr[j] <= x) {            i++;            swap(&arr[i], &arr[j]);        }    }    swap(&arr[i + 1], &arr[h]);    return (i + 1);} /* A[] --> Array to be sorted,l --> Starting index,h --> Ending index */void quickSortIterative(int arr[], int l, int h){    // Create an auxiliary stack    int stack[h - l + 1];     // initialize top of stack    int top = -1;     // push initial values of l and h to stack    stack[++top] = l;    stack[++top] = h;     // Keep popping from stack while is not empty    while (top >= 0) {        // Pop h and l        h = stack[top--];        l = stack[top--];         // Set pivot element at its correct position        // in sorted array        int p = partition(arr, l, h);         // If there are elements on left side of pivot,        // then push left side to stack        if (p - 1 > l) {            stack[++top] = l;            stack[++top] = p - 1;        }         // If there are elements on right side of pivot,        // then push right side to stack        if (p + 1 < h) {            stack[++top] = p + 1;            stack[++top] = h;        }    }} // A utility function to print contents of arrvoid printArr(int arr[], int n){    int i;    for (i = 0; i < n; ++i)        cout << arr[i] << " ";} // Driver codeint main(){    int arr[] = { 4, 3, 5, 2, 1, 3, 2, 3 };    int n = sizeof(arr) / sizeof(*arr);    quickSortIterative(arr, 0, n - 1);    printArr(arr, n);    return 0;} // This is code is contributed by rathbhupendra
// An iterative implementation of quick sort#include <stdio.h> // A utility function to swap two elementsvoid swap(int* a, int* b){    int t = *a;    *a = *b;    *b = t;} /* This function is same in both iterative and recursive*/int partition(int arr[], int l, int h){    int x = arr[h];    int i = (l - 1);     for (int j = l; j <= h - 1; j++) {        if (arr[j] <= x) {            i++;            swap(&arr[i], &arr[j]);        }    }    swap(&arr[i + 1], &arr[h]);    return (i + 1);} /* A[] --> Array to be sorted,   l  --> Starting index,   h  --> Ending index */void quickSortIterative(int arr[], int l, int h){    // Create an auxiliary stack    int stack[h - l + 1];     // initialize top of stack    int top = -1;     // push initial values of l and h to stack    stack[++top] = l;    stack[++top] = h;     // Keep popping from stack while is not empty    while (top >= 0) {        // Pop h and l        h = stack[top--];        l = stack[top--];         // Set pivot element at its correct position        // in sorted array        int p = partition(arr, l, h);         // If there are elements on left side of pivot,        // then push left side to stack        if (p - 1 > l) {            stack[++top] = l;            stack[++top] = p - 1;        }         // If there are elements on right side of pivot,        // then push right side to stack        if (p + 1 < h) {            stack[++top] = p + 1;            stack[++top] = h;        }    }} // A utility function to print contents of arrvoid printArr(int arr[], int n){    int i;    for (i = 0; i < n; ++i)        printf("%d ", arr[i]);} // Driver program to test above functionsint main(){    int arr[] = { 4, 3, 5, 2, 1, 3, 2, 3 };    int n = sizeof(arr) / sizeof(*arr);    quickSortIterative(arr, 0, n - 1);    printArr(arr, n);    return 0;}
// Java program for implementation of QuickSortimport java.util.*; class QuickSort {    /* This function takes last element as pivot,    places the pivot element at its correct    position in sorted array, and places all    smaller (smaller than pivot) to left of    pivot and all greater elements to right    of pivot */    static int partition(int arr[], int low, int high)    {        int pivot = arr[high];         // index of smaller element        int i = (low - 1);        for (int j = low; j <= high - 1; j++) {            // If current element is smaller than or            // equal to pivot            if (arr[j] <= pivot) {                i++;                 // swap arr[i] and arr[j]                int temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }         // swap arr[i+1] and arr[high] (or pivot)        int temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;         return i + 1;    }     /* A[] --> Array to be sorted,   l  --> Starting index,   h  --> Ending index */    static void quickSortIterative(int arr[], int l, int h)    {        // Create an auxiliary stack        int[] stack = new int[h - l + 1];         // initialize top of stack        int top = -1;         // push initial values of l and h to stack        stack[++top] = l;        stack[++top] = h;         // Keep popping from stack while is not empty        while (top >= 0) {            // Pop h and l            h = stack[top--];            l = stack[top--];             // Set pivot element at its correct position            // in sorted array            int p = partition(arr, l, h);             // If there are elements on left side of pivot,            // then push left side to stack            if (p - 1 > l) {                stack[++top] = l;                stack[++top] = p - 1;            }             // If there are elements on right side of pivot,            // then push right side to stack            if (p + 1 < h) {                stack[++top] = p + 1;                stack[++top] = h;            }        }    }    // Driver code    public static void main(String args[])    {        int arr[] = { 4, 3, 5, 2, 1, 3, 2, 3 };        int n = 8;         // Function calling        quickSortIterative(arr, 0, n - 1);         for (int i = 0; i < n; i++) {            System.out.print(arr[i] + " ");        }    }}
# Python program for implementation of Quicksort # This function is same in both iterative and recursivedef partition(arr, l, h):    i = ( l - 1 )    x = arr[h]     for j in range(l, h):        if   arr[j] <= x:             # increment index of smaller element            i = i + 1            arr[i], arr[j] = arr[j], arr[i]     arr[i + 1], arr[h] = arr[h], arr[i + 1]    return (i + 1) # Function to do Quick sort# arr[] --> Array to be sorted,# l  --> Starting index,# h  --> Ending indexdef quickSortIterative(arr, l, h):     # Create an auxiliary stack    size = h - l + 1    stack = [0] * (size)     # initialize top of stack    top = -1     # push initial values of l and h to stack    top = top + 1    stack[top] = l    top = top + 1    stack[top] = h     # Keep popping from stack while is not empty    while top >= 0:         # Pop h and l        h = stack[top]        top = top - 1        l = stack[top]        top = top - 1         # Set pivot element at its correct position in        # sorted array        p = partition( arr, l, h )         # If there are elements on left side of pivot,        # then push left side to stack        if p-1 > l:            top = top + 1            stack[top] = l            top = top + 1            stack[top] = p - 1         # If there are elements on right side of pivot,        # then push right side to stack        if p + 1 < h:            top = top + 1            stack[top] = p + 1            top = top + 1            stack[top] = h # Driver code to test abovearr = [4, 3, 5, 2, 1, 3, 2, 3]n = len(arr)quickSortIterative(arr, 0, n-1)print ("Sorted array is:")for i in range(n):    print ("% d" % arr[i]), # This code is contributed by Mohit Kumra
// C# program for implementation of QuickSortusing System; class GFG {     /* This function takes last element as pivot,    places the pivot element at its correct    position in sorted array, and places all    smaller (smaller than pivot) to left of    pivot and all greater elements to right    of pivot */    static int partition(int[] arr, int low,                         int high)    {        int temp;        int pivot = arr[high];         // index of smaller element        int i = (low - 1);        for (int j = low; j <= high - 1; j++) {            // If current element is smaller            // than or equal to pivot            if (arr[j] <= pivot) {                i++;                 // swap arr[i] and arr[j]                temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }         // swap arr[i+1] and arr[high]        // (or pivot)         temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;         return i + 1;    }     /* A[] --> Array to be sorted,    l --> Starting index,    h --> Ending index */    static void quickSortIterative(int[] arr,                                   int l, int h)    {        // Create an auxiliary stack        int[] stack = new int[h - l + 1];         // initialize top of stack        int top = -1;         // push initial values of l and h to        // stack        stack[++top] = l;        stack[++top] = h;         // Keep popping from stack while        // is not empty        while (top >= 0) {            // Pop h and l            h = stack[top--];            l = stack[top--];             // Set pivot element at its            // correct position in            // sorted array            int p = partition(arr, l, h);             // If there are elements on            // left side of pivot, then            // push left side to stack            if (p - 1 > l) {                stack[++top] = l;                stack[++top] = p - 1;            }             // If there are elements on            // right side of pivot, then            // push right side to stack            if (p + 1 < h) {                stack[++top] = p + 1;                stack[++top] = h;            }        }    }     // Driver code    public static void Main()    {        int[] arr = { 4, 3, 5, 2, 1, 3, 2, 3 };        int n = 8;         // Function calling        quickSortIterative(arr, 0, n - 1);         for (int i = 0; i < n; i++)            Console.Write(arr[i] + " ");    }} // This code is contributed by anuj_67.
<?php// An iterative implementation of quick sort // A utility function to swap two elementsfunction swap ( &$a, &$b ){    $t = $a;    $a = $b;    $b = $t;} /* This function is same in both iterative and recursive*/function partition (&$arr, $l, $h){    $x = $arr[$h];    $i = ($l - 1);     for ($j = $l; $j <= $h- 1; $j++)    {        if ($arr[$j] <= $x)        {            $i++;            swap ($arr[$i], $arr[$j]);        }    }    swap ($arr[$i + 1], $arr[$h]);    return ($i + 1);} /* A[] --> Array to be sorted,l --> Starting index,h --> Ending index */function quickSortIterative (&$arr, $l, $h){    // Create an auxiliary stack    $stack=array_fill(0, $h - $l + 1, 0);     // initialize top of stack    $top = -1;     // push initial values of l and h to stack    $stack[ ++$top ] = $l;    $stack[ ++$top ] = $h;     // Keep popping from stack while is not empty    while ( $top >= 0 )    {        // Pop h and l        $h = $stack[ $top-- ];        $l = $stack[ $top-- ];         // Set pivot element at its correct position        // in sorted array        $p = partition( $arr, $l, $h );         // If there are elements on left side of pivot,        // then push left side to stack        if ( $p-1 > $l )        {            $stack[ ++$top ] = $l;            $stack[ ++$top ] = $p - 1;        }         // If there are elements on right side of pivot,        // then push right side to stack        if ( $p+1 < $h )        {            $stack[ ++$top ] = $p + 1;            $stack[ ++$top ] = $h;        }    }} // A utility function to print contents of arrfunction printArr( $arr, $n ){    for ( $i = 0; $i < $n; ++$i )        echo $arr[$i]." ";} // Driver code    $arr = array(4, 3, 5, 2, 1, 3, 2, 3);    $n = count($arr);    quickSortIterative($arr, 0, $n - 1 );    printArr($arr, $n ); // This is code is contributed by chandan_jnu?>
<script>    // Javascript program for implementation of QuickSort         /* This function takes last element as pivot,    places the pivot element at its correct    position in sorted array, and places all    smaller (smaller than pivot) to left of    pivot and all greater elements to right    of pivot */    function partition(arr, low, high)    {        let temp;        let pivot = arr[high];          // index of smaller element        let i = (low - 1);        for (let j = low; j <= high - 1; j++) {            // If current element is smaller            // than or equal to pivot            if (arr[j] <= pivot) {                i++;                  // swap arr[i] and arr[j]                temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }          // swap arr[i+1] and arr[high]        // (or pivot)          temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;          return i + 1;    }      /* A[] --> Array to be sorted,    l --> Starting index,    h --> Ending index */    function quickSortIterative(arr, l, h)    {        // Create an auxiliary stack        let stack = new Array(h - l + 1);        stack.fill(0);          // initialize top of stack        let top = -1;          // push initial values of l and h to        // stack        stack[++top] = l;        stack[++top] = h;          // Keep popping from stack while        // is not empty        while (top >= 0) {            // Pop h and l            h = stack[top--];            l = stack[top--];              // Set pivot element at its            // correct position in            // sorted array            let p = partition(arr, l, h);              // If there are elements on            // left side of pivot, then            // push left side to stack            if (p - 1 > l) {                stack[++top] = l;                stack[++top] = p - 1;            }              // If there are elements on            // right side of pivot, then            // push right side to stack            if (p + 1 < h) {                stack[++top] = p + 1;                stack[++top] = h;            }        }    }         let arr = [ 4, 3, 5, 2, 1, 3, 2, 3 ];    let n = 8;     // Function calling    quickSortIterative(arr, 0, n - 1);     for (let i = 0; i < n; i++)      document.write(arr[i] + " "); // This code is contributed by mukesh07.</script>
Output: 
1 2 2 3 3 3 4 5
The above-mentioned optimizations for recursive quicksort can also be applied to the iterative version.1) Partition process is the same in both recursive and iterative. The same techniques to choose optimal pivot can also be applied to the iterative version.2) To reduce the stack size, first push the indexes of smaller half.3) Use insertion sort when the size reduces below an experimentally calculated threshold.References: http://en.wikipedia.org/wiki/QuicksortThis article is compiled by Aashish Barnwal and reviewed by GeeksforGeeks team. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
vt_m
rathbhupendra
Chandan_Kumar
divyeshrabadiya07
mukesh07
ddeevviissaavviittaa
Quick Sort
Sorting
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge Sort
QuickSort
Bubble Sort
Insertion Sort
Selection Sort
HeapSort
std::sort() in C++ STL
Time Complexities of all Sorting Algorithms
Radix Sort
Merge two sorted arrays