Dutch National Flag Three Way Partition in DSA C# - Time & Space Complexity
We want to understand how the time needed to sort an array into three parts grows as the array gets bigger.
Specifically, how fast can we separate values into three groups in one pass?
Analyze the time complexity of the following code snippet.
void DutchNationalFlagPartition(int[] arr, int pivot) {
int low = 0, mid = 0, high = arr.Length - 1;
while (mid <= high) {
if (arr[mid] < pivot) {
Swap(arr, low, mid);
low++; mid++;
} else if (arr[mid] == pivot) {
mid++;
} else {
Swap(arr, mid, high);
high--;
}
}
}
void Swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
This code sorts the array into three parts: less than pivot, equal to pivot, and greater than pivot, all in one pass.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that moves the mid pointer through the array.
- How many times: Each element is visited at most once or twice, but the loop runs at most n times where n is array length.
As the array size grows, the number of steps grows roughly the same as the number of elements.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 to 20 steps |
| 100 | About 100 to 200 steps |
| 1000 | About 1000 to 2000 steps |
Pattern observation: The steps grow linearly with input size, roughly doubling the input doubles the work.
Time Complexity: O(n)
This means the time to complete the partition grows directly in proportion to the number of elements.
[X] Wrong: "Because there are nested if-else checks, the time complexity must be O(n²)."
[OK] Correct: The loop runs only once through the array, and each element is moved at most once or twice, so the total steps grow linearly, not quadratically.
Understanding this linear-time partitioning is a great skill to show you can handle efficient sorting and grouping in one pass, a common real-world need.
"What if we changed the algorithm to use two passes instead of one? How would the time complexity change?"
Practice
Dutch National Flag Three Way Partition algorithm?Solution
Step 1: Understand the algorithm's purpose
The Dutch National Flag algorithm partitions an array into three parts: less than, equal to, and greater than a pivot.Step 2: Compare with other options
Sorting or finding max are different tasks; reversing is unrelated.Final Answer:
To rearrange an array into three parts based on a pivot value -> Option AQuick Check:
Partitioning = Rearranging into three parts [OK]
- Confusing partitioning with sorting
- Thinking it finds max or min values
- Assuming it reverses the array
arr[i] and arr[j] in an array?Solution
Step 1: Understand swapping in C# arrays
Swapping requires a temporary variable to hold one value while assigning the other.Step 2: Check each option
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; uses a temp variable correctly; B overwrites values; C and D are invalid syntax in C#.Final Answer:
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; -> Option BQuick Check:
Swap needs temp variable [OK]
- Overwriting values without temp variable
- Using non-existent swap functions
- Confusing syntax from other languages
arr = [2, 0, 2, 1, 1, 0] with pivot = 1?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
Resulting array is [0, 0, 1, 1, 2, 2].Final Answer:
[0, 0, 1, 1, 2, 2] -> Option CQuick Check:
Partitioned array = [0,0,1,1,2,2] [OK]
- Not grouping equal elements in the middle
- Mixing order of groups
- Ignoring pivot value placement
int low = 0, mid = 0, high = arr.Length - 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--;
}
}Solution
Step 1: Check Swap usage
Swap(arr[low], arr[mid]) passes values, not indices; swapping values won't affect array elements.Step 2: Correct swap call
Swap should be a method swapping elements by indices or use a temp variable to swap arr[low] and arr[mid].Final Answer:
Swap method is called incorrectly; should swap array elements by index -> Option DQuick Check:
Swap must affect array elements, not just values [OK]
- Passing values instead of indices to swap
- Incorrect loop boundary conditions
- Forgetting to initialize pivot
arr = [3, 5, 2, 3, 8, 3, 1] and pivot = 3, how would you modify the Dutch National Flag algorithm to partition the array so that all elements less than 3 come first, then all elements equal to 3, and finally all elements greater than 3? What is the final array?Solution
Step 1: Apply Dutch National Flag partition with pivot 3
Group elements less than 3: 1,2; equal to 3: 3,3,3; greater than 3: 5,8.Step 2: Arrange groups in order less, equal, greater
Final array is [2, 1, 3, 3, 3, 5, 8].Final Answer:
[2, 1, 3, 3, 3, 5, 8] -> Option AQuick Check:
Partitioned array = [2,1,3,3,3,5,8] [OK]
- Mixing order of groups
- Not grouping all equal elements together
- Ignoring elements equal to pivot
Ready to prove it?
Pass the test and this pattern moves unknown
