public class RadixSort {
public void radixSort(int[] data, int left, int right) {
if (left < 0 || right > data.length - 1 || left >= right) {
return;
}
int maxDigit = getMaxDigit(data);
int mod = 10;
int dev = 1;
for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
int[][] counter = new int[20][0];
for (int j = left; j <= right; j++) {
int bucket = ((data[j] % mod) / dev) + 10;
counter[bucket] = arrayAppend(counter[bucket], data[j]);
}
int index = left;
for (int[] bucket : counter) {
for (int value : bucket) {
data[index++] = value;
}
}
}
}
private int getMaxDigit(int[] data) {
int maxAbsValue = getAbsMaxValue(data);
return getNumLength(maxAbsValue);
}
private int getAbsMaxValue(int[] data) {
int maxAbsValue = data[0];
for (int value : data) {
if (Math.abs(maxAbsValue) < Math.abs(value)) {
maxAbsValue = value;
}
}
return maxAbsValue;
}
private int getNumLength(int value) {
if (value == 0) {
return 1;
}
int length = 0;
for (int i = value; i != 0; i /= 10) {
length++;
}
return length;
}
private int[] arrayAppend(int[] data, int value) {
data = Arrays.copyOf(data, data.length + 1);
data[data.length - 1] = value;
return data;
}
}