# 3-Way QuickSort (Dutch National Flag)

CServer Side ProgrammingProgramming

#### C in Depth: The Complete C Programming Guide for Beginners

45 Lectures 4.5 hours

#### Practical C++: Learn C++ Basics Step by Step

Most Popular

50 Lectures 4.5 hours

#### Master C and Embedded C Programming- Learn as you go

66 Lectures 5.5 hours

Here we will see the quicksort technique but we will use three-way quicksort. The basic quicksort technique is just finding an element as pivot then partition the array around pivot, after that, recur for sub arrays on left and right of the pivot.

The three-way quicksort is similar, but there are three sections. array arr[1 to n] is divided into three parts.

• arr[1 to i]
• arr[i + 1, j]
• arr[j + 1, n]

## Algorithm

partition(arr, left, right, i, j) −

begin
if right – left <= 1, then
if arr[right] < arr[left], then
swap arr[right] and arr[left]
i := left
j := right
return
end if
mid := left, pivot = arr[right]
while mid <= right, do
if arr[mid] < pivot, then
swap arr[left], arr[mid]
increase left and mid by 1
else if arr[mid] = pivot, then increase mid by 1
else
swap arr[mid], arr[right]
decrease right by 1
done
i := left – 1
j := mid
end

quicksort(arr, left, right) −

begin
if left >= right, then
return
end if
define i and j
partition(arr, left, right, i, j)
quicksort(arr, left, i)
quicksort(arr, j, right)
end

## Example

#include<iostream>
#include<vector>
using namespace std;
void partition(int arr[], int left, int right, int &i, int &j) {
if (right - left <= 1) {
if (arr[right] < arr[left])
swap(arr[right], arr[left]);
i = left;
j = right;
return;
}
int mid = left;
int pivot = arr[right];
while (mid <= right) {
if (arr[mid]<pivot)
swap(arr[left++], arr[mid++]);
else if (arr[mid]==pivot)
mid++;
else if (arr[mid] > pivot)
swap(arr[mid], arr[right--]);
}
i = left-1;
j = mid;
}
void quicksort(int arr[], int left, int right) {
if (left >= right) //1 or 0 elements
return;
int i, j;
partition(arr, left, right, i, j);
quicksort(arr, left, i);
quicksort(arr, j, right);
}
void display(int arr[], int n) {
for (int i = 0; i < n; ++i)
cout << " " << arr[i];
cout << endl;
}
int main() {
int a[] = {4, 9, 4, 3, 1, 9, 4, 3, 9, 4, 3, 1, 4};
int n = sizeof(a) / sizeof(int);
display(a, n);
quicksort(a, 0, n - 1);
display(a, n);
}

## Output

4 9 4 3 1 9 4 3 9 4 3 1 4
1 1 3 3 3 4 4 4 4 4 9 9 9