What if you could sort three groups perfectly in just one quick sweep?
Why Dutch National Flag Three Way Partition in DSA C++?
Imagine sorting a box of colored balls manually into three groups: red, white, and blue. You pick one ball at a time and try to place it in the right group, but you keep mixing them up and have to start over.
Sorting by checking each ball multiple times is slow and confusing. You waste time moving balls back and forth, and mistakes happen easily because you lose track of which balls are sorted.
The Dutch National Flag algorithm sorts the balls in one pass by keeping track of three sections: reds, whites, and blues. It swaps balls smartly so each ball is placed correctly without extra passes or confusion.
for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (arr[j] < arr[i]) std::swap(arr[i], arr[j]); } }
int low = 0, mid = 0, high = n - 1; while (mid <= high) { if (arr[mid] == 0) std::swap(arr[low++], arr[mid++]); else if (arr[mid] == 1) mid++; else std::swap(arr[mid], arr[high--]); }
This method lets you sort three groups quickly and clearly in just one pass, saving time and avoiding mistakes.
Sorting customer feedback into negative, neutral, and positive categories instantly to understand overall sentiment without multiple reviews.
Manual sorting of three groups is slow and error-prone.
Dutch National Flag algorithm sorts in one pass using three pointers.
It efficiently separates items into three categories with minimal swaps.
Practice
Solution
Step 1: Understand the partitioning goal
The algorithm divides the array into three parts: less than pivot, equal to pivot, and greater than pivot.Step 2: Recognize the rearrangement purpose
This helps in sorting or grouping elements efficiently without full sorting.Final Answer:
To rearrange an array so that all elements less than a pivot come first, then equal, then greater -> Option AQuick Check:
Partitioning = Rearranging by pivot [OK]
- Confusing partition with full sorting
- Thinking it only finds max or min
- Assuming it reverses the array
Solution
Step 1: Identify pointer initialization
In the algorithm, low and mid start at 0, high starts at n-1 (last index).Step 2: Match correct initialization
int low = 0, mid = 0, high = n - 1; correctly initializes low and mid to 0, high to n-1.Final Answer:
int low = 0, mid = 0, high = n - 1; -> Option CQuick Check:
Pointers start: low=0, mid=0, high=n-1 [OK]
- Initializing pointers incorrectly
- Setting high to 0 instead of n-1
- Not initializing mid at 0
arr = [2, 0, 2, 1, 1, 0] with pivot = 1?Solution
Step 1: Partition array by pivot 1
Elements less than 1: 0,0; equal to 1: 1,1; greater than 1: 2,2.Step 2: Rearrange array accordingly
Place all 0s first, then 1s, then 2s resulting in [0, 0, 1, 1, 2, 2].Final Answer:
[0, 0, 1, 1, 2, 2] -> Option BQuick Check:
Less, equal, greater order = [0,0,1,1,2,2] [OK]
- Not grouping equal elements in the middle
- Mixing order of groups
- Assuming full sort instead of partition
int low = 0, mid = 0, high = n - 1;
while (mid <= high) {
if (arr[mid] < pivot) {
swap(arr[low], arr[mid]);
low++;
} else if (arr[mid] == pivot) {
mid++;
} else {
swap(arr[mid], arr[high]);
high--;
}
}Solution
Step 1: Analyze pointer increments
When arr[mid] < pivot, low is incremented but mid is not incremented, causing infinite loop.Step 2: Identify missing mid increment
Mid must also increment after swapping to move forward.Final Answer:
Missing increment of mid when arr[mid] < pivot -> Option DQuick Check:
Increment mid after swap for less than pivot [OK]
- Forgetting to increment mid after swap with low
- Changing loop condition incorrectly
- Ignoring pivot initialization
arr = [3, 5, 2, 3, 8, 3, 1] and want to partition it using the Dutch National Flag algorithm with pivot = 3. Which of the following is the correct final partitioned array?Solution
Step 1: Group elements by pivot 3
Less than 3: 1, 2; equal to 3: 3, 3, 3; greater than 3: 5, 8.Step 2: Arrange groups in order
Place less first, then equal, then greater: [1, 2, 3, 3, 3, 5, 8].Step 3: Check options for exact order
[1, 2, 3, 3, 3, 5, 8] matches the correct partition with greater elements 5 and 8 in any order, which is valid partitioning.Final Answer:
[1, 2, 3, 3, 3, 5, 8] -> Option AQuick Check:
Partition order less, equal, greater = [1,2,3,3,3,5,8] [OK]
- Assuming full sort instead of partition
- Mixing order of greater elements
- Placing equal elements incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
