static unsigned
bits(int n, unsigned lsb, unsigned len) {
// Return from n a block of len bits with with the least-significant bit of
// the block being bit lsb in n (rightmost bit in n is lsb = 0).
return (static_cast<unsigned>(n) >> rightmost) % (1 << len);
}
static unsigned
ceiling(int a, int b) {
// Return ceiling(a/b).
return static_cast<int>(static_cast<double>(a)/b + 0.9);
}
void
straight_radix_sort(int a[], unsigned n, unsigned radix_bits) {
assert((0 < radix_bits) ∧ (radix_bits ≤ sizeof(int)*8));
const unsigned radix = 1 << radix_bits;
unsigned
* counts = new unsigned [radix],
* starts = new unsigned [radix];
int * tmp = new int [n];
for (unsigned digit = 0; digit < ceiling(sizeof(int)*8, radix_bits); digit++) {
unsigned i;
memset(counts, 0, sizeof(unsigned)*radix);
for (i = 0; i < n; i++)
counts[bits(a[i], digit*radix_bits, radix_bits)]++;
starts[0] = 0;
for (i = 1; i < radix; i++)
starts[i] = starts[i - 1] + counts[i - 1];
assert(starts[radix - 1] + counts[radix - 1] == n);
for (i = 0; i < n; i++)
tmp[starts[bits(a[i], digit*radix_bits, radix_bits)]++] = a[i];
memcpy(a, tmp, sizeof(int)*n);
}
delete [] counts;
delete [] starts;
delete [] tmp;
}
This page last modified on 24 January 2006.