Для того чтобы не ставить условие в
for (int i = 0; i < arr.length; i++) {
cnt[j][1 + iByteN(arr[i], j)]++;
}
?
Если сделать так, то тоже работает:
int cnt[][] = new int[numBytes][256];
int b[] = new int[arr.length];
for (int j = 0; j < numBytes; j++) {
// подсчитываем количество элементов для каждого значения j-го разряда
for (int i = 0; i < arr.length; i++) {
if (iByteN(arr[i], j) < 255)
cnt[j][1 + iByteN(arr[i], j)]++;
}
//вычисляем позиции cnt[i], начиная с которых будут располагаться элементы
//с соответствующим значением j-го разряда
for (int i = 1; i < 256; i++)
cnt[j][i] += cnt[j][i - 1];
...