class Main {
public static int findMax(int[] arr) {
int max = 0;
for(int i = 0; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}
}
return max;
}
public static int calBitCount(int max) {
int count = 0;
while(max >= 1) {
max /= 10;
count++;
}
return count;
}
public static int getBitValue (int value, int bit) {
if(bit == 0) {
return value%10;
}
if(bit == 1) {
return value/10%10;
}
if(bit == 2) {
return value/100;
}
return 0;
}
public static void radixSort(int[] arr) {
int max = findMax(arr);
int bitCount = calBitCount(max);
int radixCount = 10;
int[] count = new int[radixCount];
int[] tempArray = new int[arr.length];
for (int b = 0; b < bitCount; ++b) {
for(int i = 0; i < radixCount; ++i) {
count[i] = 0;
}
for (int i = 0; i < arr.length; ++i) {
int bitValue = getBitValue(arr[i], b);
count[bitValue]++;
}
for (int c = 1; c < radixCount; ++c) {
count[c] += count[c-1];
}
for (int i = arr.length - 1; i >= 0; --i) {
int bitValue = getBitValue(arr[i], b);
tempArray[--count[bitValue]] = arr[i];
}
for(int i = 0; i < arr.length; ++i) {
arr[i] = tempArray[i];
}
}
}
public static void printArray(int[] arr) {
for(int i = 0; i < arr.length; ++i) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int[] arr = {149, 34, 72, 3, 66, 28, 14};
printArray(arr);
radixSort(arr);
System.out.println();
printArray(arr);
}
}