// r is the radix
// k is the number of digits in each item in radix r
// i is the pass (which digit we're sorting on)
// place is the place value of this digit in radix r
// count[i] holds the # of elements whose ith digit is <= i
// b is an auxiliary n-element array
// Note that (a[j]/place)%r is the "place" digit; e.g., if place=10, it's
// the 10s digit.
// Numbers (1), (2), etc are used in analysis below
for (int i=0, place = 1; i < k; i++, place*=r)
{
// initialize count (1)
for (int j=0; j<r; j++)
count[j]=0;
// count # elements with each digit in this place (2)
for (int j=0; j<N; j++)
count[(a[j]/place)%r]++;
// accumulate array count (3)
for (int j=1; j<r; j++)
count[j] += count[j-1];
// sort by ith digit into array b, working backwords from
// a to keep each pass stable (4)
for (int j=N-1; j>=0; j--)
b[--count[(a[j]/place)%r]] = a[j];
// copy back to a in preparation for next pass (5)
for (int j=0; j<N; j++)
a[j] = b[j];
}
(1) r (2) N (3) r (4) N (5) NSo the overall complexity is O(k(N+r)). Radix r is typically small, so we treat it as a constant. Then if k (the number of digits) is constant, radix sort is O(N). But if the N values are distinct, k must be at least logrN, giving a time of O(NlogN). Alternatively, the value of k can be decreased by increasing r. In particular, we can fix k by letting r vary; e.g., r=2^((log2N)/k) processes log2N/k bits at a time. process Since 2^((log2N)/k) < N, this gives a linear sort.
Example: Let k=4. Then for a 32-bit word -- representing 2^32 different integers -- r=2^(32/4) = 2^8 = 256. This sounds big until you think that this supports up to 2^32 distinct values -- very large N.