// Worked with Eric Wong on this
import java.util.*;
public class Driver {
public static void main(String[] args) {
RandomGen r = new RandomGen();
long start, end;
long maxValue = Long.MAX_VALUE;
int arraysLength;
if (args.length == 1)
arraysLength = Integer.parseInt(args[0]);
else if (args.length == 2) {
arraysLength = Integer.parseInt(args[0]);
maxValue = (long) Math.pow(10, Integer.parseInt(args[1]));
}
else if (args.length > 2)
arraysLength = args.length;
else
arraysLength = 1000000;
ArrayList[] buckets = new ArrayList[10];
for (int i=0; i<buckets.length; i++) {
buckets[i] = new ArrayList();
}
long[] numbers = new long[arraysLength];
for (int i=0; i<numbers.length; i++) {
if (args.length > 2)
numbers[i] = Long.parseLong(args[i]);
else if (args.length == 2)
numbers[i] = r.nextLong(maxValue);
else
numbers[i] = Math.abs(r.nextLong());
}
long[] numbersCopy = numbers;
//System.out.println(Arrays.toString(numbers));
long maxNumber = 0;
for (int i=0; i<numbers.length; i++) {
if (numbers[i] > maxNumber)
maxNumber = numbers[i];
}
int maxPower = 0;
while (maxNumber > 0) {
maxNumber /= 10;
maxPower++;
}
start = System.nanoTime();
for (int n=0; n<maxPower; n++) {
for (int i=0; i<numbers.length; i++) {
int digit = (int) (numbers[i] / Math.pow(10, n)) % 10;
buckets[digit].add(numbers[i]);
}
int numbersIndex = 0;
for (int b=0; b<buckets.length; b++) {
for (int e=0; e<buckets[b].size(); e++) {
numbers[numbersIndex] = (Long) buckets[b].get(e);
numbersIndex++;
}
}
for (int i=0; i<buckets.length; i++) {
buckets[i] = new ArrayList();
}
}
end = System.nanoTime();
//System.out.println(Arrays.toString(numbers));
System.out.println((end - start) / 1000000.);
start = System.nanoTime();
Arrays.sort(numbersCopy);
end = System.nanoTime();
//System.out.println(Arrays.toString(numbersCopy));
System.out.println((end - start) / 1000000.);
}
}
/* Results (in milliseconds: Radix - Quicksort)
* int[] a = {5,3,67,2,11,787,3,6,1}: .735 - .166
* An array of 10,000 3 digit numbers: 31.38 - 3.507
* An array of 100,000 3 digit numbers: 82.739 - 24.407
* An array of 1,000,000 3 digit numbers: 856.888 - 118.602
* An array of 10,000 18 digit numbers (Long.MAX_VALUE): 56.78 - .697
* An array of 100,000 18 digit numbers (Long.MAX_VALUE): 306.143 - 16.971
* An array of 1,000,000 18 digit numbers (Long.MAX_VALUE): 3149.106 - 154.281
*/