import java.util.*;
import static java.lang.Math.pow;
import static java.lang.System.nanoTime;
public class SortBenchmark {
public static void main(String[] args) {
Random random = new Random();
long[][][] times = new long[2][8][3]; //some multi-dimensional array: [sortMethod][numItems][numDigits]
for (byte i = 0; i <= 7; i++) {
System.out.println("Working...");
int[] numbers4 = new int[(int) pow(10, i)];
int[] numbers9 = new int[(int) pow(10, i)];
int[] numbersMax = new int[(int) pow(10, i)]; //Contains numbers with the maximum number of digits possible for an int
for (int j = 0; j < (int) pow(10, i); j++) {
numbers4[j] = random.nextInt(10000);
numbers9[j] = random.nextInt(1000000000);
numbersMax[j] = random.nextInt(Integer.MAX_VALUE); //Too lazy to figure out the way to include the maximum integer
}
//These copies are for sorting by the Arrays.sort method
int[] _numbers4, _numbers9, _numbersMax;
_numbers4 = Arrays.copyOf(numbers4, numbers4.length);
_numbers9 = Arrays.copyOf(numbers9, numbers9.length);
_numbersMax = Arrays.copyOf(numbersMax, numbersMax.length);
long t1, t2;
t1 = nanoTime();
Sort.sort(numbers4);
t2 = nanoTime();
times[0][i][0] = t2 - t1;
t1 = nanoTime();
Arrays.sort(numbers4);
t2 = nanoTime();
times[1][i][0] = t2 - t1;
t1 = nanoTime();
Sort.sort(numbers9);
t2 = nanoTime();
times[0][i][1] = t2 - t1;
t1 = nanoTime();
Arrays.sort(numbers9);
t2 = nanoTime();
times[1][i][1] = t2 - t1;
t1 = nanoTime();
Sort.sort(numbersMax);
t2 = nanoTime();
times[0][i][2] = t2 - t1;
t1 = nanoTime();
Arrays.sort(numbersMax);
t2 = nanoTime();
times[1][i][2] = t2 - t1;
}
//How to print out the data?
System.out.println("\nFormat: digits/number of elements: time");
for (byte i = 0; i < 2; i++) {
if (i == 0) {System.out.println("Time to sort with the custom-written radix method:");}
if (i == 1) {System.out.println("\n\nTime to sort with built-in Arrays.sort method:");}
for (byte j = 0; j <= 7; j++) {
for (byte k = 0; k < 3; k++) {
byte digits = 0;
if (k == 0) {digits = 4;}
if (k == 1) {digits = 9;}
if (k == 2) {digits = 10;}
System.out.println("" + digits + "/" + (int) pow(10, j) + ": " + times[i][j][k] + " ns/" + ((double) times[i][j][k] / 1000000) + " ms/" + ((double) times[i][j][k] / 1000000000) + "s");
}
System.out.println();
}
}
}
}