Iterative Quick Sort (original) (raw)

Last Updated : 23 Jul, 2025

Following is a typical recursive implementation of Quick Sort that uses last element as pivot.

C++ `

// CPP code for recursive function of Quicksort #include <bits/stdc++.h> using namespace std;

/* 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 code int 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

// Java program for implementation of QuickSort import 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] + " ");
    }
}

}

Python

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 pivot

def 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 sort

def 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 Code

if 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#

// C# program for implementation of // QuickSort using 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.

JavaScript

PHP

temp=temp = temp=a; a=a = a=b; b=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 */ function partition (&$arr, l,l, l,h) { x=x = x=arr[$h]; i=(i = (i=(l - 1); for ($j = l;l; l;j <= h−1;h - 1; h1;j++) { if ($arr[$j] <= $x) { $i++; swap ($arr[$i], arr[arr[arr[j]); } } swap ($arr[$i + 1], arr[arr[arr[h]); return ($i + 1); } /* A[] --> Array to be sorted, l --> Starting index, h --> Ending index */ function quickSort(&$A, l,l, l,h) { if ($l < $h) { /* Partitioning index */ p=partition(p = partition(p=partition(A, l,l, l,h); quickSort($A, l,l, l,p - 1); quickSort($A, p+1,p + 1, p+1,h); } } // Driver code $n = 5; $arr = array(4, 2, 6, 9, 2); quickSort($arr, 0, $n - 1); for($i = 0; i<i < i<n; $i++) { echo arr[arr[arr[i] . " "; } // This code is contributed by // rathbhupendra ?>

`

**Output:

2 2 4 6 9

The above implementation can be optimized in many ways

  1. 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++ `

// An iterative implementation of quick sort #include <bits/stdc++.h> using namespace std;

/* 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 arr void printArr(int arr[], int n) { int i; for (i = 0; i < n; ++i) cout << arr[i] << " "; }

// Driver code int 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

C

// An iterative implementation of quick sort #include <stdio.h>

// A utility function to swap two elements void 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 arr void printArr(int arr[], int n) { int i; for (i = 0; i < n; ++i) printf("%d ", arr[i]); }

// Driver program to test above functions int 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

// Java program for implementation of QuickSort import 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

Python program for implementation of Quicksort

This function is same in both iterative and recursive

def 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 index

def 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 above

arr = [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#

// C# program for implementation of QuickSort using 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.

JavaScript

PHP

t=t = t=a; a=a = a=b; b=b = b=t; } /* This function is same in both iterative and recursive*/ function partition (&$arr, l,l, l,h) { x=x = x=arr[$h]; i=(i = (i=(l - 1); for ($j = l;l; l;j <= h−1;h- 1; h1;j++) { if ($arr[$j] <= $x) { $i++; swap ($arr[$i], arr[arr[arr[j]); } } swap ($arr[$i + 1], arr[arr[arr[h]); return ($i + 1); } /* A[] --> Array to be sorted, l --> Starting index, h --> Ending index */ function quickSortIterative (&$arr, l,l, l,h) { // Create an auxiliary stack stack=arrayfill(0,stack=array_fill(0, stack=arrayfill(0,h - $l + 1, 0); // initialize top of stack $top = -1; // push initial values of l and h to stack stack[++stack[ ++stack[++top ] = $l; stack[++stack[ ++stack[++top ] = $h; // Keep popping from stack while is not empty while ( $top >= 0 ) { // Pop h and l h=h = h=stack[ $top-- ]; l=l = l=stack[ $top-- ]; // Set pivot element at its correct position // in sorted array p=partition(p = partition( p=partition(arr, l,l, l,h ); // If there are elements on left side of pivot, // then push left side to stack if ( p−1>p-1 > p1>l ) { stack[++stack[ ++stack[++top ] = $l; stack[++stack[ ++stack[++top ] = $p - 1; } // If there are elements on right side of pivot, // then push right side to stack if ( p+1<p+1 < p+1<h ) { stack[++stack[ ++stack[++top ] = $p + 1; stack[++stack[ ++stack[++top ] = $h; } } } // A utility function to print contents of arr function printArr( arr,arr, arr,n ) { for ( i=0;i = 0; i=0;i < n;++n; ++n;++i ) echo arr[arr[arr[i]." "; } // Driver code $arr = array(4, 3, 5, 2, 1, 3, 2, 3); n=count(n = count(n=count(arr); quickSortIterative($arr, 0, $n - 1 ); printArr($arr, $n ); // This is code is contributed by chandan_jnu ?>

`

**Output:

1 2 2 3 3 3 4 5

**Time Complexity: O(n*log(n))
**Auxiliary Space: O(n)

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:
    https://en.wikipedia.org/wiki/Quicksort
    This article is compiled by **Aashish Barnwal and reviewed by GeeksforGeeks team.