# C Program for Iterative Quick Sort

• Last Updated : 08 Jun, 2022

## C

 `// An iterative implementation of quick sort``#include ` `// 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;``}`

Output:

`1 2 2 3 3 3 4 5`

Iterative Quicksort Algorithm:

1. Start
2. Pick any element as a pivot.
3. If the element is less than the pivot.
4. Swap with the element at the index.
5. Increment index.
6. Push all the elements less than pivot to the left.
7.  Push all the elements greater elements to the right.
8. Swap the rightmost element with the element at the index.
9. Return index.
10. Print sorted array.
11. Stop

PSEUDOCODE :

```QUICKSORT(ARR, BEG, END)
IF (BEG < END)
PIVOTINDEX = PARTITION(ARR,BEG, END)
QUICKSORT(ARR, BEG, PIVOTINDEX)
QUICKSORT(ARR, PIVOTINDEX + 1, END)
PARTITION(ARR, BEG, END)
SET END AS PIVOTINDEX
PINDEX = BEG - 1
FOR I = BEG TO END-1
IF ARR[I] < PIVOT
SWAP ARR[I] AND ARR[PINDEX]
PINDEX++
SWAP PIVOT AND ARR[PINDEX+1]
RETURN PINDEX + 1```

TIME COMPLEXITY :

BEST CASE COMPLEXITY –
In quicksort, the best-case complexity occurs when the pivot element is present at the middle position. Then the best-case time complexity of quicksort is o(n*logn).

The best-case time complexity of quicksort is o(n*logn).
AVERAGE-CASE COMPLEXITY –
Average-case complexity occurs when the array elements are in random order .Then the average case time complexity of quicksort is o(n*logn).

Then average case time complexity of quicksort is o(n*logn).
WORST-CASE COMPLEXITY –
In quick sort, worst-case complexity occurs if the pivot element is present at the last element of the array the worst case would occur. The worst-case time complexity of quicksort is o(n2).
The worst-case time complexity of quicksort is o(n2)

The above mentioned optimizations for recursive quick sort can also be applied to iterative version. 1) Partition process is same in both recursive and iterative. The same techniques to choose optimal pivot can also be applied to iterative version. 2) To reduce the stack size, first push the indexes of smaller half. 3) Use insertion sort when the size reduces below a experimentally calculated threshold. Please refer complete article on Iterative Quick Sort for more details!

My Personal Notes arrow_drop_up