QuickSort algorithm uses the divide and conquers method to sort an Array. It contains a function that is used to partition (divide the array) using a pivot element. Generally, the pivot element selected is the rightmost element of the array (You can select the leftmost also but some conditions will change). The elements of the array are interchanged in such a way that the pivot element position is fixed and all the elements left to it are smaller and the right ones are larger than it.
Pseudocode of QuickSort
Here arr is the array, ‘l’ is the leftmost index of the array/subarray and ‘r’ is the rightmost array index. Here we assume that the array starts from index 0.
function quickSort(arr, l, r) if l < r pivotIndex = partition(arr, l, r) quickSort(arr, l, pivotIndex - 1) quickSort(arr, pivotIndex + 1, r) function partition(arr, l, r) pivot = arr[r] i = l - 1 for j = l to r - 1 if arr[j] < pivot i = i + 1 swap arr[i] and arr[j] swap arr[i + 1] and arr[r] return i + 1
Partition function takes O(n) time to compute for an array of size n.
The worst-case occurs when the size of the array after each partition is decreased by 1 after each iteration. Such cases occur when the array is: sorted either in ascending or descending order & when all the elements are identical.
T(n)= T(n-1)+ O(n)
So, after back substitution
T(n) = O(n*n)
The best-case occurs when the size of the array decreases either into half or into some constant ratio.
When the array breaks into n/2 sizes:
T(n)=2T(n/2) + O(n)
Applying Master’s theorem,
T(n)= Θ(n*log n)
There are Various optimizations that can be applied to QuickSort to improve its worst-case behavior. These optimizations include choosing a random pivot, using the “median-of-three” pivot selection strategy, or switching to an alternative sorting algorithm (such as HeapSort) for small subarrays.
Overall, the QuickSort algorithm is mostly used and efficient sorting algorithm.