// LSD 8-bit radix with fused histograms (5 array passes)
void sort(unsigned *a, int n) {
static unsigned h[4][256];
static unsigned tmp[1<<16];
for (int i = 0; i < 256; i++) h[0][i] = 0;
for (int i = 0; i < n; i++) h[0][a[i] & 255]++;
unsigned s = 0;
for (int i = 0; i < 256; i++) { unsigned c = h[0][i]; h[0][i] = s; s += c; }
for (int i = 0; i < 256; i++) h[1][i] = 0;
for (int i = 0; i < n; i++) { unsigned v = a[i]; tmp[h[0][v & 255]++] = v; h[1][(v >> 8) & 255]++; }
s = 0;
for (int i = 0; i < 256; i++) { unsigned c = h[1][i]; h[1][i] = s; s += c; }
for (int i = 0; i < 256; i++) h[2][i] = 0;
for (int i = 0; i < n; i++) { unsigned v = tmp[i]; a[h[1][(v >> 8) & 255]++] = v; h[2][(v >> 16) & 255]++; }
s = 0;
for (int i = 0; i < 256; i++) { unsigned c = h[2][i]; h[2][i] = s; s += c; }
for (int i = 0; i < 256; i++) h[3][i] = 0;
for (int i = 0; i < n; i++) { unsigned v = a[i]; tmp[h[2][(v >> 16) & 255]++] = v; h[3][v >> 24]++; }
s = 0;
for (int i = 0; i < 256; i++) { unsigned c = h[3][i]; h[3][i] = s; s += c; }
for (int i = 0; i < n; i++) { unsigned v = tmp[i]; a[h[3][v >> 24]++] = v; }
}