Sort Colors Using Two Pointer Dutch Flag Algorithm
📖 Scenario: You are organizing colored balls in a line. The balls can be red, white, or blue, represented by numbers 0, 1, and 2 respectively. Your task is to arrange them so that all reds come first, then whites, and finally blues.
🎯 Goal: Build a program that sorts an array of colors (0s, 1s, and 2s) using the two-pointer Dutch National Flag algorithm.
📋 What You'll Learn
Create an array called colors with the exact values: {2, 0, 2, 1, 1, 0}
Create two integer variables called low and high initialized to 0 and colors.size() - 1 respectively
Use a while loop with an integer variable mid starting at 0 to sort the array using the Dutch National Flag algorithm
Print the sorted colors array in the format: 0 -> 0 -> 1 -> 1 -> 2 -> 2 -> null
💡 Why This Matters
🌍 Real World
Sorting colored objects or items by category quickly and efficiently is common in manufacturing and inventory management.
💼 Career
Understanding two-pointer techniques and in-place sorting algorithms is valuable for software engineering roles involving data manipulation and optimization.
Progress0 / 4 steps
1
Create the colors array
Create a std::vector<int> called colors with these exact values: {2, 0, 2, 1, 1, 0}
DSA C++
Hint
Use std::vector<int> colors = {2, 0, 2, 1, 1, 0}; to create the array.
2
Initialize pointers for sorting
Create two integer variables called low and high. Set low = 0 and high = colors.size() - 1
DSA C++
Hint
Use int low = 0; and int high = colors.size() - 1; to set the pointers.
3
Sort the colors using Dutch National Flag algorithm
Create an integer variable mid initialized to 0. Use a while loop with condition mid <= high. Inside the loop, apply the Dutch National Flag logic to sort the colors vector.
DSA C++
Hint
Use three pointers: low, mid, and high. Move mid through the array and swap elements to sort 0s, 1s, and 2s.
4
Print the sorted colors array
Use a for loop to print the elements of colors separated by " -> ". After the last element, print "null".
DSA C++
Hint
Use a for loop to print each element followed by " -> ", then print "null" at the end.
Practice
(1/5)
1. What is the main goal of the Sort Colors Two Pointer Dutch Flag algorithm?
easy
A. To find the maximum element in an array
B. To sort any array of integers in ascending order
C. To sort an array containing only 0s, 1s, and 2s in a single pass
D. To reverse the elements of an array
Solution
Step 1: Understand the problem context
The algorithm is designed specifically for arrays with only three distinct values: 0, 1, and 2.
Step 2: Identify the algorithm's purpose
It sorts these values in one pass using two pointers, placing all 0s first, then 1s, then 2s.
Final Answer:
To sort an array containing only 0s, 1s, and 2s in a single pass -> Option C
Quick Check:
Sort colors = sort 0,1,2 in one pass [OK]
Hint: Remember: Dutch Flag sorts 0,1,2 in one pass [OK]
Common Mistakes:
Thinking it sorts any integer array
Confusing it with general sorting algorithms
Assuming it reverses the array
2. Which of the following is the correct initialization of pointers in the Dutch National Flag algorithm in C++?
easy
A. int low = 0, mid = n - 1, high = 0;
B. int low = 0, mid = 0, high = n - 1;
C. int low = n - 1, mid = 0, high = 0;
D. int low = 0, mid = 0, high = 0;
Solution
Step 1: Understand pointer roles
Low and mid start at the beginning (index 0), high starts at the end (index n-1).
Step 2: Match initialization
int low = 0, mid = 0, high = n - 1; correctly initializes low and mid to 0, and high to n-1.
Final Answer:
int low = 0, mid = 0, high = n - 1; -> Option B
Quick Check:
Pointers start low=0, mid=0, high=end [OK]
Hint: Start low and mid at 0, high at last index [OK]
Common Mistakes:
Setting low or mid to n-1 incorrectly
Initializing all pointers to zero
Confusing high pointer position
3. What will be the output of the following C++ code snippet?
std::vector<int> nums = {2, 0, 2, 1, 1, 0};
int low = 0, mid = 0, high = nums.size() - 1;
while (mid <= high) {
if (nums[mid] == 0) {
std::swap(nums[low], nums[mid]);
low++; mid++;
} else if (nums[mid] == 1) {
mid++;
} else {
std::swap(nums[mid], nums[high]);
high--;
}
}
for (int num : nums) std::cout << num << " ";
medium
A. 0 0 1 1 2 2
B. 2 2 1 1 0 0
C. 0 1 0 1 2 2
D. 1 0 2 0 1 2
Solution
Step 1: Trace the sorting process
Initially: {2,0,2,1,1,0}
- Swap 2 and 0 at low and mid, low=1, mid=1
- mid points to 0, swap with low, low=2, mid=2
- mid points to 2, swap with high (0), high=4
- mid points to 0, swap with low, low=3, mid=3
- mid points to 1, mid++
- mid points to 1, mid++
Loop ends.
Step 2: Final array after sorting
The array becomes: 0 0 1 1 2 2
Final Answer:
0 0 1 1 2 2 -> Option A
Quick Check:
Sorted colors output = 0 0 1 1 2 2 [OK]
Hint: Swap 0s left, 2s right, 1s stay middle [OK]
Common Mistakes:
Not swapping correctly when nums[mid] == 2
Incrementing mid after swapping with high
Confusing pointer updates
4. Identify the error in the following C++ code implementing the Dutch National Flag algorithm:
int low = 0, mid = 0, high = n - 1;
while (mid < high) {
if (nums[mid] == 0) {
std::swap(nums[low], nums[mid]);
low++;
mid++;
} else if (nums[mid] == 1) {
mid++;
} else {
std::swap(nums[mid], nums[high]);
high--;
}
}
medium
A. Pointers low and mid should start at n - 1
B. The high pointer should be incremented instead of decremented
C. Swapping should be done only when nums[mid] == 1
D. The loop condition should be 'mid <= high' instead of 'mid < high'
Solution
Step 1: Analyze loop condition
The loop uses 'mid < high', which misses the case when mid equals high, leaving last element unsorted.
Step 2: Correct loop condition
Changing to 'mid <= high' ensures all elements are processed including when mid equals high.
Final Answer:
The loop condition should be 'mid <= high' instead of 'mid < high' -> Option D
Quick Check:
Loop must cover mid == high for full sorting [OK]
Hint: Use 'mid <= high' to cover all elements [OK]
Common Mistakes:
Using 'mid < high' misses last element
Starting pointers incorrectly
Wrong pointer increments or decrements
5. Given an array nums containing only 0s, 1s, and 2s, how would you modify the Dutch National Flag algorithm to count how many swaps are performed during sorting?
hard
A. Add a counter variable and increment it each time a swap is done inside the loop
B. Count the number of 0s, 1s, and 2s before sorting
C. Increment a counter every time mid pointer moves
D. Count swaps only when nums[mid] == 1
Solution
Step 1: Understand when swaps happen
Swaps occur when nums[mid] is 0 or 2, swapping with low or high pointers respectively.
Step 2: Implement swap counting
Introduce an integer counter initialized to zero, increment it inside the loop each time std::swap is called.
Final Answer:
Add a counter variable and increment it each time a swap is done inside the loop -> Option A
Quick Check:
Count swaps by incrementing on each swap call [OK]
Hint: Increment counter inside swap blocks only [OK]
Common Mistakes:
Counting pointer moves instead of swaps
Counting swaps for 1s which are not swapped
Counting before sorting instead of during
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.