On Jun 30, 12:21 am, Sathaiah Dontula <[email protected]> wroe:
> @Gene, Your logic is specific to 0, 1 and 2.
>
> Let me change the problem, there are three different symbols in an array,
> separate them in O(n) with O(1) space.
>
> Thanks,
> Sathaiah
Well, your problem was specific to 0, 1, and 2.
Arbitrary symbols are no different. You just create a lookup table
that maps the symbols to 0,1,2 and look them up as needed. In the
code below I made the lookup table s myself, but you could easily do
it with a O(n) preprocessing pass.
#include <stdio.h>
#define M 3
int idx(int *s, int ai)
{
int i = 0;
for (i = 0; i < M; i++)
if (s[i] == ai) return i;
return -1;
}
void sort(int *s, int *a, int n)
{
int i, j, c[M];
for (j = 0; j < M; j++) c[j] = 0;
for (i = 0; i < n; i++) ++c[idx(s, a[i])];
for (i = j = 0; j < M; j++)
while (c[j]--)
a[i++] = s[j];
}
int main(void)
{
int i, s[] = {'a','b','c'}, a[] =
{ 'c','c','a','b','a','b','c','a','c'};
sort(s, a, sizeof a / sizeof a[0]);
for (i = 0; i < sizeof a / sizeof a[0]; i++)
printf("%c ", a[i]);
printf("\n");
return 0;
}
--
You received this message because you are subscribed to the Google Groups
"Algorithm Geeks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/algogeeks?hl=en.