#define RADIX   256
#define N       16

U8 a[N];

class List
{
    List *next;
    U8   *a;

} l[N], *r[RADIX];

U0 DumpIn()
{
    I64 i;

    "$RED$\n\nInput$FG$\n";
    for (i = 0; i < N; i++)
        "%d:%d\n", i, a[i];
}

U0 DumpOut()
{
    I64   i, j = 0;
    List *tmpl;

    "$RED$\n\nOutput$FG$\n";
    for (i = 0; i < RADIX; i++)
    {
        tmpl = r[i];
        while (tmpl)
        {
            "%d:%d\n", j++, *tmpl->a;
            tmpl = tmpl->next;
        }
    }
}

U0 Init()
{
    I64 i;

    MemSet(r, 0, sizeof(r));
    for (i = 0; i < N; i++)
    {
        a[i] = RandU16&255;
        l[i].next   = NULL;
        l[i].a      = &a[i];
    }
}

U0 Sort()
{
    I64 i;

    for (i = 0; i < N; i++)
    {
        l[i].next = r[*l[i].a];
        r[*l[i].a] = &l[i];
    }
}

U0 RadixSort()
{
    Init;
    DumpIn;
    Sort;
    DumpOut;
}

RadixSort;