Sort Colors Using Two Pointer Dutch Flag Algorithm
📖 Scenario: You are organizing colored balls in a row. 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 then blues.
🎯 Goal: Build a Rust program that sorts a list of colors represented by numbers 0, 1, and 2 using the two-pointer Dutch Flag algorithm.
📋 What You'll Learn
Create a vector called colors with the exact values [2, 0, 2, 1, 1, 0].
Create two variables called low and high to track the positions for 0 and 2 respectively.
Use a while loop with a variable current to sort the colors vector in place.
Print the sorted colors vector at the end.
💡 Why This Matters
🌍 Real World
Sorting colored objects quickly is useful in graphics, games, and organizing items by categories.
💼 Career
Understanding in-place sorting algorithms and pointer manipulation is important for software engineering and systems programming.
Progress0 / 4 steps
1
Create the colors vector
Create a vector called colors with the exact values [2, 0, 2, 1, 1, 0].
DSA Rust
Hint
Use let mut colors = vec![2, 0, 2, 1, 1, 0]; to create a mutable vector.
2
Initialize pointers for sorting
Create two variables called low and high. Set low to 0 and high to the last index of colors (which is 5). Also create a variable current and set it to 0.
DSA Rust
Hint
Use colors.len() - 1 to get the last index.
3
Sort colors using the two-pointer Dutch Flag algorithm
Use a while loop that runs while current <= high. Inside the loop, check the value at colors[current]. If it is 0, swap it with colors[low], then increment low and current. If it is 2, swap it with colors[high] and decrement high. If it is 1, just increment current.
DSA Rust
Hint
Remember to swap elements and update pointers carefully to avoid infinite loops.
4
Print the sorted colors vector
Print the colors vector using println!("{:?}", colors); to show the sorted result.
DSA Rust
Hint
Use println!("{:?}", colors); to print the vector.
Practice
(1/5)
1. What is the main goal of the Sort Colors Two Pointer Dutch Flag algorithm?
easy
A. To sort an array containing only 0s, 1s, and 2s in a single pass
B. To sort any array of integers in ascending order
C. To find the maximum value in an array
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 sorting goal
The goal is to rearrange the array so that all 0s come first, then all 1s, and finally all 2s, in one pass without extra space.
Final Answer:
To sort an array containing only 0s, 1s, and 2s in a single pass -> Option A
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 Rust code snippets correctly declares the pointers used in the Dutch Flag algorithm?
easy
A. let mut low = 0; let mut mid = 0; let mut high = nums.len() - 1;
B. let low = 0; let mid = 0; let high = nums.len();
C. let mut low = 1; let mut mid = 1; let mut high = nums.len() - 1;
D. let mut low = 0; let mut mid = 1; let mut high = nums.len();
Solution
Step 1: Identify pointer initialization
In the Dutch Flag algorithm, low and mid start at 0, and high starts at the last index (len() - 1).
Step 2: Check mutability and bounds
All pointers must be mutable to move during sorting, and high must be len() - 1 to avoid out-of-bounds errors.
Final Answer:
let mut low = 0; let mut mid = 0; let mut high = nums.len() - 1; -> Option A
Quick Check:
Correct pointer setup = let mut low = 0; let mut mid = 0; let mut high = nums.len() - 1; [OK]
Hint: Pointers start at 0 except high at last index [OK]
Common Mistakes:
Setting high to nums.len() causing out-of-bounds
Not using mutable variables
Starting pointers at wrong indices
3. What will be the output of the following Rust code after applying the Dutch Flag algorithm?
let mut nums = vec![2, 0, 2, 1, 1, 0];
let mut low = 0;
let mut mid = 0;
let mut high = nums.len() - 1;
while mid <= high {
match nums[mid] {
0 => {
nums.swap(low, mid);
low += 1;
mid += 1;
},
1 => {
mid += 1;
},
2 => {
nums.swap(mid, high);
if high == 0 { break; }
high -= 1;
},
_ => {}
}
}
println!("{:?}", nums);
medium
A. [0, 1, 0, 1, 2, 2]
B. [2, 2, 1, 1, 0, 0]
C. [0, 0, 1, 1, 2, 2]
D. [1, 0, 2, 0, 1, 2]
Solution
Step 1: Trace initial swaps and pointer moves
Starting with nums = [2,0,2,1,1,0], the algorithm swaps 2 at mid with 0 at high, then moves pointers accordingly.
Step 2: Continue until mid passes high
After all swaps and increments, the array becomes sorted as [0, 0, 1, 1, 2, 2].
Final Answer:
[0, 0, 1, 1, 2, 2] -> Option C
Quick Check:
Sorted 0,1,2 array = [0,0,1,1,2,2] [OK]
Hint: Swap 0s left, 2s right, 1s stay middle [OK]
Common Mistakes:
Not updating pointers correctly after swap
Swapping with wrong indices
Stopping loop too early
4. Identify the bug in this Rust code snippet implementing the Dutch Flag algorithm:
let mut nums = vec![2, 0, 1];
let mut low = 0;
let mut mid = 0;
let mut high = nums.len();
while mid <= high {
match nums[mid] {
0 => {
nums.swap(low, mid);
low += 1;
mid += 1;
},
1 => {
mid += 1;
},
2 => {
nums.swap(mid, high);
high -= 1;
},
_ => {}
}
}
medium
A. The match statement is missing a case for 3
B. mid pointer is not incremented after swapping 2
C. low pointer is incremented incorrectly
D. high is initialized to nums.len(), causing out-of-bounds access
Solution
Step 1: Check pointer initialization
high is set to nums.len(), which is one past the last valid index, causing out-of-bounds when accessing nums[high].
Step 2: Understand valid index range
Valid indices are 0 to nums.len() - 1, so high should be initialized to nums.len() - 1.
Final Answer:
high is initialized to nums.len(), causing out-of-bounds access -> Option D
Quick Check:
high must be last index, not length [OK]
Hint: high = length - 1 to avoid out-of-bounds [OK]
Common Mistakes:
Using length instead of last index for high
Not incrementing mid after swapping 2
Ignoring pointer bounds
5. Given an array nums = [1, 2, 0, 1, 2, 0, 1], how many swaps will the Dutch Flag algorithm perform to sort it?
hard
A. 3
B. 4
C. 5
D. 6
Solution
Step 1: Trace swaps during sorting
Initial array: [1, 2, 0, 1, 2, 0, 1]. Swaps occur when 0 or 2 is found at mid.
Step 2: Count swaps step-by-step
Swaps:
- Swap 0 at index 2 with 1 at low (index 0) -> 1 swap
- Swap 2 at index 1 with 1 at high (index 6) -> 1 swap
- Swap 0 at index 5 with 1 at low (index 1) -> 1 swap
- Swap 2 at index 1 with 1 at high (index 5) -> 1 swap
Total swaps = 4.
Final Answer:
4 -> Option B
Quick Check:
Count swaps for 0 and 2 moves = 4 [OK]
Hint: Count swaps only when swapping 0 or 2 [OK]
Common Mistakes:
Counting pointer moves as swaps
Missing swaps when 2 is swapped
Assuming swaps equal array length
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.