54 lines
1.2 KiB
C++
54 lines
1.2 KiB
C++
|
/* Dutch Flag Algo: To separate three different entities
|
||
|
e.g :- Sort 0s,1s and 2s in an array without using sorting algo
|
||
|
Complexity : O(n)
|
||
|
*/
|
||
|
|
||
|
#include <iostream>
|
||
|
using namespace std;
|
||
|
|
||
|
/* 0 0 0 1 1 1 ? ? ? ? 2 2 2
|
||
|
| | |
|
||
|
v v v
|
||
|
Low Mid High
|
||
|
|
||
|
> In this algo, we tend to shrink this '?' region
|
||
|
whose ends are pointed by Mid and High indexes.
|
||
|
|
||
|
> Low points to the region where the 1s start
|
||
|
|
||
|
*/
|
||
|
|
||
|
void dutch_flag(int arr[],int size){
|
||
|
//mid to high is the region we are about to shrink
|
||
|
int low = 0, mid = 0, high = size-1;
|
||
|
while(mid <= high){
|
||
|
if(arr[mid] == 0){
|
||
|
swap(arr[low],arr[mid]);
|
||
|
low++; mid++;
|
||
|
}
|
||
|
else if(arr[mid] == 1){
|
||
|
mid++;
|
||
|
}
|
||
|
else if(arr[mid] == 2){
|
||
|
swap(arr[high],arr[mid]);
|
||
|
high--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Utility function to print the array
|
||
|
void printArray(int arr[], int arr_size)
|
||
|
{
|
||
|
for (int i = 0; i < arr_size; i++)
|
||
|
cout << arr[i] << " ";
|
||
|
}
|
||
|
|
||
|
|
||
|
int main(){
|
||
|
int a[] = {0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1};
|
||
|
int n = sizeof(a)/sizeof(a[0]);
|
||
|
dutch_flag(a,n);
|
||
|
printArray(a,n);
|
||
|
return 0;
|
||
|
}
|