1+ #include < algorithm>
2+ #include < iostream>
3+ #include < vector>
4+
5+ void dutchNationalFlag (std::vector<int > &arr) {
6+ int low = 0 , mid = 0 , high = arr.size () - 1 ;
7+
8+ while (mid <= high) {
9+ if (arr[mid] == 0 ) // if arr[mid] is 0 it needs to be placed in the
10+ // beginning so swap it with low position
11+ swap (arr[low++], arr[mid++]);
12+ else if (arr[mid] ==
13+ 1 ) // if arr[mid] is 1 it needs to be placed in the middle ,so
14+ // just increase the value of mid
15+ mid++;
16+ else
17+ swap (arr[mid],
18+ arr[high--]); // if arr[mid] is 2 it needs to be placed in the
19+ // beginning so swap it with high position
20+ }
21+ }
22+
23+ int main () {
24+ vector<int > arr = {2 , 0 , 1 , 2 , 1 , 0 , 1 , 2 };
25+ dutchNationalFlag (arr);
26+
27+ for (int x : arr) cout << x << " " ;
28+ cout << " \n " ;
29+ }
30+ // a dry run to explain the code:
31+ // arr = {2, 0, 1, 2, 1, 0, 1, 2} We have three pointers :
32+
33+ // low → start of 0’s segment
34+
35+ // mid → current element
36+
37+ // high → end of 2’s segment
38+
39+ // Initially :
40+
41+ // ini Copy code low = 0,
42+ // mid = 0,
43+ // high = 7 arr = [ 2, 0, 1, 2, 1, 0, 1, 2 ] Step 1
44+ // : arr[mid] = 2
45+
46+ // Swap arr[mid] and
47+ // arr[high] → swap 2 with 2(no change)
48+
49+ // Decrement high = 6
50+
51+ // ini Copy code arr = [ 2, 0, 1, 2, 1, 0, 1, 2 ] low = 0,
52+ // mid = 0,
53+ // high = 6 Step 2 : arr[mid] = 2
54+
55+ // Swap arr[mid] and
56+ // arr[high] → swap 2 with 1
57+
58+ // Decrement high = 5
59+
60+ // ini Copy code arr =
61+ // [ 1, 0, 1, 2, 1, 0, 2, 2 ] low = 0,
62+ // mid = 0,
63+ // high = 5 Step 3 : arr[mid] = 1
64+
65+ // Do nothing,
66+ // just increment mid = 1
67+
68+ // ini Copy code arr = [ 1, 0, 1, 2, 1, 0, 2, 2 ] low = 0,
69+ // mid = 1,
70+ // high = 5 Step 4 : arr[mid] = 0
71+
72+ // Swap arr[low] and
73+ // arr[mid] → swap 1 and 0
74+
75+ // Increment low = 1,
76+ // mid = 2
77+
78+ // ini Copy code arr = [ 0, 1, 1, 2, 1, 0, 2, 2 ] low = 1,
79+ // mid = 2,
80+ // high = 5 Step 5 : arr[mid] = 1
81+
82+ // Increment mid = 3
83+
84+ // ini Copy code arr =
85+ // [ 0, 1, 1, 2, 1, 0, 2, 2 ] low = 1,
86+ // mid = 3,
87+ // high = 5 Step 6 : arr[mid] = 2
88+
89+ // Swap arr[mid] and
90+ // arr[high] → swap 2 and 0
91+
92+ // Decrement high = 4
93+
94+ // ini Copy code arr =
95+ // [ 0, 1, 1, 0, 1, 2, 2, 2 ] low = 1,
96+ // mid = 3,
97+ // high = 4 Step 7 : arr[mid] = 0
98+
99+ // Swap arr[low] and
100+ // arr[mid] → swap 1 and 0
101+
102+ // Increment low = 2,
103+ // mid = 4
104+
105+ // ini Copy code arr = [ 0, 0, 1, 1, 1, 2, 2, 2 ] low = 2,
106+ // mid = 4,
107+ // high = 4 Step 8 : arr[mid] = 1
108+
109+ // Increment mid = 5 → now mid > high,
110+ // done !
111+
112+ // Final sorted array :
113+
114+ // csharp Copy code[0, 0, 1, 1, 1, 2, 2, 2]
0 commit comments