Introduction to the Dutch National Flag Algorithm
The Dutch National Flag Algorithm is a classic computer science technique designed to solve the problem of sorting an array consisting of three distinct types of elements. It was proposed by Edsger W. Dijkstra to efficiently handle three-way partitioning problems without requiring extra space or multiple passes through the array.
This algorithm is widely used not only in sorting problems but also as a subroutine in complex algorithms like QuickSort variations, especially when handling arrays with many duplicate elements.
Problem Definition
Given an array containing three distinct values (for example, 0, 1, and 2), the task is to reorder the elements such that all elements of one kind are grouped together. This means all 0s come first, followed by all 1s, and then all 2s, in linear time O(n) and with constant space complexity O(1).
Concept Behind the Algorithm
The algorithm partitions the array into three sections:
- Low: holds all elements less than the pivot (e.g., 0)
- Mid: holds all elements equal to the pivot (e.g., 1)
- High: holds all elements greater than the pivot (e.g., 2)
It maintains three pointers:
low– boundary for the smaller elementsmid– current element under considerationhigh– boundary for the larger elements
Step-by-Step Explanation
- Initialize pointers:
low = 0, mid = 0, high = n-1 - Traverse the array while
mid <= high: - If
arr[mid] == 0, swap elements atlowandmid, increment bothlowandmid. - If
arr[mid] == 1, just movemidforward. - If
arr[mid] == 2, swap elements atmidandhigh, and decrementhighonly. - Repeat until
midsurpasseshigh.
Example with Visual Output
Consider the array: [2, 0, 2, 1, 1, 0]
| Step | Array State | low | mid | high | Action |
|---|---|---|---|---|---|
| Initial | [2, 0, 2, 1, 1, 0] | 0 | 0 | 5 | Start |
| 1 | [0, 0, 2, 1, 1, 2] | 1 | 0 | 4 | Swap arr[0]&arr[5], high– |
| 2 | [0, 0, 2, 1, 1, 2] | 1 | 1 | 4 | Swap arr[1]&arr[1], low++, mid++ |
| 3 | [0, 0, 2, 1, 1, 2] | 1 | 2 | 4 | arr[mid] == 2, swap arr[2]&arr[4], high– |
| 4 | [0, 0, 1, 1, 2, 2] | 1 | 2 | 3 | Swap happened, high– |
| 5 | [0, 0, 1, 1, 2, 2] | 1 | 3 | 3 | arr[mid] == 1, mid++ |
| 6 | [0, 0, 1, 1, 2, 2] | 1 | 4 | 3 | mid > high, done |
Interactive Code Example (JavaScript)
This example demonstrates the algorithm’s steps for an array with three distinct values:
function dutchNationalFlag(arr) {
let low = 0, mid = 0, high = arr.length - 1;
while(mid <= high) {
if(arr[mid] === 0) {
[arr[low], arr[mid]] = [arr[mid], arr[low]];
low++;
mid++;
} else if(arr[mid] === 1) {
mid++;
} else { // arr[mid] === 2
[arr[mid], arr[high]] = [arr[high], arr[mid]];
high--;
}
}
return arr;
}
// Example usage
console.log(dutchNationalFlag([2, 0, 2, 1, 1, 0]));
Use Cases and Advantages
- Sorting arrays with three unique elements: Useful in color sorting, e.g., RGB flag representation.
- Preprocessing in QuickSort: Efficient handling of duplicated elements reduces worst-case scenarios.
- Linear time and constant space complexity: Runs in
O(n)time withO(1)extra space.
Comparison With Other Methods
| Method | Time Complexity | Space Complexity | Description |
|---|---|---|---|
| Two-Pass Counting | O(n) | O(1) | Count elements, then overwrite array; requires two passes |
| Dutch National Flag (One-Pass) | O(n) | O(1) | Single pass, swaps in-place with three pointers |
| Standard Sort (e.g., QuickSort) | O(n log n) | O(log n) to O(n) | General-purpose sorting, less efficient for three distinct values |
Summary
The Dutch National Flag Algorithm offers an elegant and optimal solution for three-way partitioning problems. By cleverly managing three pointers and performing swaps in a single pass, it sorts arrays containing three unique elements in linear time and constant space, making it a valuable technique in both academic and practical programming challenges.
Whether sorting colors, preparing data, or optimizing other algorithms, understanding and implementing this algorithm is essential for efficient algorithm designers.








