You have an array containing only '0's, '1's and '2's. Club same items together in single scan.
let's try to understand problem:
algorithm:
i) initialize i and j to 0 and k to n-1 Where n is number of balls
ii) while j <= k do
if pointer j point to red ball than
swap a[i] and a[j];
and perform i++; j++
if pointer j point to white ball than
just perform j++
if pointer j point to blue ball than
swap a[j] and a[k];
and perform k--;
This problem is also known as Dutch National Flag Problem. Check out how Dutch flag looks like:
code:
#include <stdio.h> //here red->0, white->1, blue->2 int arr[] = { 0,1,0,2,2,0,1,1,0 }; int arr_size = sizeof(arr)/sizeof(arr[0]); void swap(int *a, int *b); void dutchflag( ); int main() { int c; dutchflag(); printf("\ndutch flag Order: "); for (c = 0; c < arr_size; c++) printf("%d ", arr[c]); return 0; } /* test function to to Sort the balls in dutch flag order*/ void dutchflag( ) { int i = 0,j=0 , k = arr_size - 1; while(j <= k) { switch(arr[j]) { case 0: swap(&arr[i++], &arr[j++]); break; case 1: j++; break; case 2: swap(&arr[j], &arr[k--]); break; } } } /* Function to swap *a and *b */ void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }output:-
dutch flag Order: 0 0 0 0 1 1 1 2 2
Time Complexity: O(n)
Very much useful.
ReplyDelete