// Worked with Danny Qiu on this
import java.util.*;
public class Driver {
public static void main(String[] args) {
int arrayLength, maxValue;
if (args.length == 2) {
arrayLength = Integer.parseInt(args[0]);
maxValue = Integer.parseInt(args[1]);
}
else {
arrayLength = 1000000;
maxValue = 1000;
}
long start,end;
Random r = new Random();
ArrayList[] buckets = new ArrayList[10];
for (int i=0; i<buckets.length; i++) {
buckets[i] = new ArrayList();
}
int[] numbers = new int[arrayLength];
for (int i=0; i<numbers.length; i++) {
numbers[i] = r.nextInt(maxValue);
}
int[]numbersCopy = numbers;
System.out.println(Arrays.toString(numbers));
int power = 0;
for (int i=0; i<numbers.length; i++) {
if (numbers[i] > power)
power = numbers[i];
}
int maxPower = 0;
while (power > 0) {
power /= 10;
maxPower++;
}
start = System.currentTimeMillis();
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] = (Integer) buckets[b].get(e);
numbersIndex++;
}
}
for (int i=0; i<buckets.length; i++) {
buckets[i] = new ArrayList();
}
}
end = System.currentTimeMillis();
System.out.println(Arrays.toString(numbers));
System.out.println(end - start);
start = System.currentTimeMillis();
Arrays.sort(numbersCopy);
end = System.currentTimeMillis();
System.out.println(end-start);
}
}