static void radix(int stride, IRadix[] source, IRadix[] dest)
        {
            int[] count = new int[256];
            int[] index = new int[256];
            for (int i = 0; i < source.Length; i++)
                count[((source[i].ToRadixID()) >> (stride * 8)) & 0xff]++;

            index[0] = 0;
            for (int i = 1; i < 256; i++) index[i] = index[i - 1] + count[i - 1];
            for (int i = 0; i < source.Length; i++) dest[index[((source[i].ToRadixID()) >> (stride * 8)) & 0xff]++] = source[i];
        }
 public static IRadix[] Sort(IRadix[] source, int sizeOfIDInBytes)
 {
     IRadix[] dest = new IRadix[source.Length];
     bool swap = false;
     for (int i = 0; i <= sizeOfIDInBytes; i++)
     {
         if (swap)
             radix(i, dest, source);
         else
             radix(i, source, dest);
         swap = !swap;
     }
     if (swap)
         return source;
     else
         return dest;
 }