We rearrange an array into three parts: less than pivot, equal to pivot, and greater than pivot, all in one pass.
Analogy: Imagine sorting colored balls into three bins: red, white, and blue. You pick each ball once and put it in the correct bin without extra space.
[less] ← i -> [equal] ← j -> [unknown] ← k -> [greater]
Array: 2 0 2 1 1 0
Pointers: low, mid, high
Dry Run Walkthrough
Input: array: [2, 0, 2, 1, 1, 0], pivot = 1
Goal: Rearrange array so that all 0s come first, then all 1s, then all 2s
Step 1: Check element at mid=0 (value 2), swap with element at high=5 (value 0), decrease high
Array: [0, 0, 2, 1, 1, 2]
low=0, mid=0, high=4
Why: 2 is greater than pivot, so move it to the end
Step 2: Check element at mid=0 (value 0), swap with element at low=0 (same), increase low and mid
Array: [0, 0, 2, 1, 1, 2]
low=1, mid=1, high=4
Why: 0 is less than pivot, so move it to the front
Step 3: Check element at mid=1 (value 0), swap with element at low=1 (same), increase low and mid
Array: [0, 0, 2, 1, 1, 2]
low=2, mid=2, high=4
Why: 0 is less than pivot, so move it to the front
Step 4: Check element at mid=2 (value 2), swap with element at high=4 (value 1), decrease high
Array: [0, 0, 1, 1, 2, 2]
low=2, mid=2, high=3
Why: 2 is greater than pivot, so move it to the end
Step 5: Check element at mid=2 (value 1), equal to pivot, increase mid
Array: [0, 0, 1, 1, 2, 2]
low=2, mid=3, high=3
Why: 1 is equal to pivot, so keep it in the middle
Step 6: Check element at mid=3 (value 1), equal to pivot, increase mid
Array: [0, 0, 1, 1, 2, 2]
low=2, mid=4, high=3
Why: 1 is equal to pivot, so keep it in the middle
Result:
Array: [0, 0, 1, 1, 2, 2]
Annotated Code
DSA C
#include <stdio.h>
void dutch_national_flag_partition(int arr[], int size, int pivot) {
int low = 0, mid = 0, high = size - 1;
while (mid <= high) {
if (arr[mid] < pivot) {
int temp = arr[low];
arr[low] = arr[mid];
arr[mid] = temp;
low++;
mid++;
} elseif (arr[mid] == pivot) {
mid++;
} else { // arr[mid] > pivot
int temp = arr[mid];
arr[mid] = arr[high];
arr[high] = temp;
high--;
}
}
}
void print_array(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d", arr[i]);
if (i != size - 1) printf(" -> ");
}
printf(" -> null\n");
}
int main() {
int arr[] = {2, 0, 2, 1, 1, 0};
int size = sizeof(arr) / sizeof(arr[0]);
int pivot = 1;
dutch_national_flag_partition(arr, size, pivot);
print_array(arr, size);
return0;
}
while (mid <= high) {
continue processing until mid passes high
if (arr[mid] < pivot) {
if current element less than pivot, swap with low and move low and mid forward
When you need to separate an array into three groups around a pivot in one pass, use Dutch National Flag partition to do it efficiently.
Common Mistakes
Mistake: Incrementing mid pointer after swapping with high pointer Fix: Do not increment mid after swapping with high because the swapped element needs to be checked
Mistake: Using two pointers instead of three, missing the equal group Fix: Use three pointers: low, mid, and high to separate less, equal, and greater groups
Summary
Rearranges array into three parts: less than, equal to, and greater than a pivot value.
Use when you want to partition data into three categories efficiently in one pass.
The key is to use three pointers to track boundaries and swap elements accordingly without extra space.
Practice
(1/5)
1. What is the main goal of the Dutch National Flag Three Way Partition algorithm?
easy
A. To sort an array in ascending order using quicksort
B. To rearrange an array into three parts: less than, equal to, and greater than a pivot
C. To find the maximum element in an array
D. To reverse the elements of an array
Solution
Step 1: Understand the partitioning goal
The algorithm divides the array into three parts based on a pivot value: elements less than pivot, equal to pivot, and greater than pivot.
Step 2: Compare with other options
Options A, C, and D describe different operations: sorting, finding max, and reversing, which are not the main goal here.
Final Answer:
To rearrange an array into three parts: less than, equal to, and greater than a pivot -> Option B
Quick Check:
Partitioning = three parts [OK]
Hint: Remember: three parts based on pivot value [OK]
Common Mistakes:
Confusing with full sorting algorithms
Thinking it only separates two parts
Assuming it finds max or min values
2. Which of the following is the correct way to declare the pointers used in the Dutch National Flag algorithm in C?
easy
A. int low = 0, mid = 0, high = n - 1;
B. int low, mid, high = 0;
C. int low = n, mid = 0, high = n - 1;
D. int low = 0, mid = n - 1, high = 0;
Solution
Step 1: Understand pointer initialization
In the algorithm, low and mid start at 0, and high starts at n-1 (last index).
Step 2: Check each option
int low = 0, mid = 0, high = n - 1; correctly initializes low and mid to 0, high to n-1. Others have incorrect initial values.
Final Answer:
int low = 0, mid = 0, high = n - 1; -> Option A
Quick Check:
Pointers start: low=0, mid=0, high=n-1 [OK]
Hint: Initialize low and mid at 0, high at last index [OK]
Common Mistakes:
Setting low or mid to n or n-1 incorrectly
Not initializing all pointers
Confusing variable assignments
3. What will be the output array after applying the Dutch National Flag algorithm on arr = {2, 0, 2, 1, 1, 0} with pivot = 1?
medium
A. [0, 0, 1, 1, 2, 2]
B. [2, 2, 1, 1, 0, 0]
C. [1, 1, 0, 0, 2, 2]
D. [0, 1, 2, 0, 1, 2]
Solution
Step 1: Partition array around pivot 1
Elements less than 1: 0,0; equal to 1: 1,1; greater than 1: 2,2.
Step 2: Arrange in order less, equal, greater
So the array becomes [0, 0, 1, 1, 2, 2].
Final Answer:
[0, 0, 1, 1, 2, 2] -> Option A
Quick Check:
Partitioned array = [0,0,1,1,2,2] [OK]
Hint: Group less, equal, greater around pivot [OK]
Common Mistakes:
Mixing order of groups
Not grouping equal elements correctly
Assuming full sorting instead of partitioning
4. Identify the error in this C code snippet for Dutch National Flag partition:
void dnfPartition(int arr[], int n, int pivot) {
int low = 0, mid = 0, high = n - 1;
while (mid <= high) {
if (arr[mid] < pivot) {
swap(arr[low], arr[mid]);
low++;
mid++;
} else if (arr[mid] == pivot) {
mid++;
} else {
swap(arr[mid], arr[high]);
high--;
}
}
}
medium
A. Pivot comparison should use > instead of <
B. The loop condition should be mid < high
C. Pointers low and mid should start at n-1
D. swap function is not defined for array elements
Solution
Step 1: Check swap usage
The code uses swap(arr[low], arr[mid]) but swap is not a built-in function in C for array elements.
Step 2: Verify other parts
Loop condition and pointer initialization are correct. Pivot comparisons are correct as per algorithm.
Final Answer:
swap function is not defined for array elements -> Option D
Quick Check:
Missing swap definition = error [OK]
Hint: Remember to define or implement swap for array elements [OK]
Common Mistakes:
Assuming swap is built-in for arrays in C
Changing loop condition incorrectly
Wrong pointer initialization
5. Given an array arr = {3, 5, 2, 3, 8, 3, 1, 3} and pivot = 3, how many swaps will the Dutch National Flag algorithm perform to partition the array?