Last Updated : 08 Aug, 2025
Try it on GfG Practice
QuickSort is a sorting algorithm based on the Divide and Conquer that picks an element as a pivot and partitions the given array around the picked pivot by placing the pivot in its correct position in the sorted array.
It works on the principle of divide and conquer, breaking down the problem into smaller sub-problems.
There are mainly three steps in the algorithm:
Here’s a basic overview of how the QuickSort algorithm works.
Choice of PivotThere are many different choices for picking pivots.
The key process in quickSort is a partition(). There are three common algorithms to partition. All these algorithms have O(n) time complexity.
The logic is simple, we start from the leftmost element and keep track of the index of smaller (or equal) elements as i . While traversing, if we find a smaller element, we swap the current element with arr[i]. Otherwise, we ignore the current element.
Let us understand the working of partition algorithm with the help of the following example:
Illustration of QuickSort AlgorithmIn the previous step, we looked at how the partitioning process rearranges the array based on the chosen pivot. Next, we apply the same method recursively to the smaller sub-arrays on the left and right of the pivot. Each time, we select new pivots and partition the arrays again. This process continues until only one element is left, which is always sorted. Once every element is in its correct position, the entire array is sorted.
Below image illustrates, how the recursive method calls for the smaller sub-arrays on the left and right of the pivot:
C++
#include <iostream>
#include <vector>
using namespace std;
int partition(vector<int>& arr, int low, int high) {
// choose the pivot
int pivot = arr[high];
// undex of smaller element and indicates
// the right position of pivot found so far
int i = low - 1;
// Traverse arr[low..high] and move all smaller
// elements on left side. Elements from low to
// i are smaller after every iteration
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr[i], arr[j]);
}
}
// move pivot after smaller elements and
// return its position
swap(arr[i + 1], arr[high]);
return i + 1;
}
// the QuickSort function implementation
void quickSort(vector<int>& arr, int low, int high) {
if (low < high) {
// pi is the partition return index of pivot
int pi = partition(arr, low, high);
// recursion calls for smaller elements
// and greater or equals elements
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
vector<int> arr = {10, 7, 8, 9, 1, 5};
int n = arr.size();
quickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
return 0;
}
C
#include <stdio.h>
void swap(int* a, int* b);
// partition function
int partition(int arr[], int low, int high) {
// Choose the pivot
int pivot = arr[high];
// Index of smaller element and indicates
// the right position of pivot found so far
int i = low - 1;
// Traverse arr[low..high] and move all smaller
// elements to the left side. Elements from low to
// i are smaller after every iteration
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
// Move pivot after smaller elements and
// return its position
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
// The QuickSort function implementation
void quickSort(int arr[], int low, int high) {
if (low < high) {
// pi is the partition return index of pivot
int pi = partition(arr, low, high);
// recursion calls for smaller elements
// and greater or equals elements
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
Java
import java.util.Arrays;
class GfG {
// partition function
static int partition(int[] arr, int low, int high) {
// choose the pivot
int pivot = arr[high];
// index of smaller element and indicates
// the right position of pivot found so far
int i = low - 1;
// traverse arr[low..high] and move all smaller
// elements to the left side. Elements from low to
// i are smaller after every iteration
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
// Move pivot after smaller elements and
// return its position
swap(arr, i + 1, high);
return i + 1;
}
// swap function
static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// the QuickSort function implementation
static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// pi is the partition return index of pivot
int pi = partition(arr, low, high);
// recursion calls for smaller elements
// and greater or equals elements
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
public static void main(String[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
int n = arr.length;
quickSort(arr, 0, n - 1);
for (int val : arr) {
System.out.print(val + " ");
}
}
}
Python
# partition function
def partition(arr, low, high):
# choose the pivot
pivot = arr[high]
# index of smaller element and indicates
# the right position of pivot found so far
i = low - 1
# traverse arr[low..high] and move all smaller
# elements to the left side. Elements from low to
# i are smaller after every iteration
for j in range(low, high):
if arr[j] < pivot:
i += 1
swap(arr, i, j)
# move pivot after smaller elements and
# return its position
swap(arr, i + 1, high)
return i + 1
# swap function
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
# the QuickSort function implementation
def quickSort(arr, low, high):
if low < high:
# pi is the partition return index of pivot
pi = partition(arr, low, high)
# recursion calls for smaller elements
# and greater or equals elements
quickSort(arr, low, pi - 1)
quickSort(arr, pi + 1, high)
if __name__ == "__main__":
arr = [10, 7, 8, 9, 1, 5]
n = len(arr)
quickSort(arr, 0, n - 1)
for val in arr:
print(val, end=" ")
C#
using System;
class GfG {
// partition function
static int partition(int[] arr, int low, int high) {
// choose the pivot
int pivot = arr[high];
// index of smaller element and indicates
// the right position of pivot found so far
int i = low - 1;
// traverse arr[low..high] and move all smaller
// elements to the left side. Elements from low to
// i are smaller after every iteration
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
// move pivot after smaller elements and
// return its position
swap(arr, i + 1, high);
return i + 1;
}
// swap function
static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// The QuickSort function implementation
static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// pi is the partition return index of pivot
int pi = partition(arr, low, high);
// recursion calls for smaller elements
// and greater or equals elements
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
static void Main(string[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
int n = arr.Length;
quickSort(arr, 0, n - 1);
foreach (int val in arr) {
Console.Write(val + " ");
}
}
}
JavaScript
// partition function
function partition(arr, low, high)
{
// choose the pivot
let pivot = arr[high];
// index of smaller element and indicates
// the right position of pivot found so far
let i = low - 1;
// traverse arr[low..high] and move all smaller
// elements to the left side. Elements from low to
// i are smaller after every iteration
for (let j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
// move pivot after smaller elements and
// return its position
swap(arr, i + 1, high);
return i + 1;
}
// swap function
function swap(arr, i, j)
{
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// the QuickSort function implementation
function quickSort(arr, low, high)
{
if (low < high) {
// pi is the partition return index of pivot
let pi = partition(arr, low, high);
// recursion calls for smaller elements
// and greater or equals elements
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// Driver Code
let arr = [ 10, 7, 8, 9, 1, 5 ];
let n = arr.length;
// call QuickSort on the entire array
quickSort(arr, 0, n - 1);
for (let i = 0; i < arr.length; i++) {
process.stdout.write(arr[i] + " ");
}
Complexity Analysis of Quick Sort
Time Complexity:
Auxiliary Space:
Please refer Time and Space Complexity Analysis of Quick Sort for more details.
Advantages of Quick SortPlease refer Application of Quicksort for more details.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4