Iterativ
Iterativ
#include <bits/stdc++.h>
*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 x = arr[h];
int i = (l - 1);
i++;
swap(&arr[i], &arr[j]);
return (i + 1);
if (l < h) {
/* Partitioning index */
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);
return 0;
Output:
22469
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.
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.
// An iterative implementation of quick sort
#include <stdio.h>
int t = *a;
*a = *b;
*b = t;
int x = arr[h];
int i = (l - 1);
if (arr[j] <= x) {
i++;
swap(&arr[i], &arr[j]);
}
swap(&arr[i + 1], &arr[h]);
return (i + 1);
stack[++top] = l;
stack[++top] = h;
// Pop h and l
h = stack[top--];
l = stack[top--];
// Set pivot element at its correct position
// in sorted array
if (p - 1 > l) {
stack[++top] = l;
stack[++top] = p - 1;
if (p + 1 < h) {
stack[++top] = p + 1;
stack[++top] = h;
int i;
for (i = 0; i < n; ++i)
int main()
int arr[] = { 4, 3, 5, 2, 1, 3, 2, 3 };
quickSortIterative(arr, 0, n - 1);
printArr(arr, n);
return 0;
Output:
12233345
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.