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.

Reply via email to