import java.util.*;
import java.io.*;
public class Radix {
public static void main(String[] args) {
Random r = new Random();
int n1 = 10000;
int n2 = 100000;
int d1 = 10;
int d2 = 100;
int[] a1 = new int[n1];
int[] a2 = new int[n2];
int[] a3 = new int[n1];
int[] a4 = new int[n2];
for (int i=0; i<n1; i++)
a1[i] = r.nextInt((int) Math.pow(10, d1));
for (int i=0; i<n2; i++)
a2[i] = r.nextInt((int) Math.pow(10, d1));
for (int i=0; i<n1; i++)
a3[i] = r.nextInt((int) Math.pow(10, d2));
for (int i=0; i<n2; i++)
a4[i] = r.nextInt((int) Math.pow(10, d2));
long t;
System.out.println("Insertion sort tests");
t = System.currentTimeMillis();
insertion(a1);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
insertion(a2);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
insertion(a3);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
insertion(a4);
t = System.currentTimeMillis() - t;
System.out.println(t);
System.out.println("Selection sort tests");
t = System.currentTimeMillis();
selection(a1);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
selection(a2);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
selection(a3);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
selection(a4);
t = System.currentTimeMillis() - t;
System.out.println(t);
System.out.println("Bubble sort tests");
t = System.currentTimeMillis();
bubble(a1);
t = System.currentTimeMillis() - t;
System.out.println(t);
//System.out.println(Arrays.toString(a1));
t = System.currentTimeMillis();
bubble(a2);
t = System.currentTimeMillis() - t;
System.out.println(t);
//System.out.println(Arrays.toString(a2));
t = System.currentTimeMillis();
bubble(a3);
t = System.currentTimeMillis() - t;
System.out.println(t);
//System.out.println(Arrays.toString(a3));
t = System.currentTimeMillis();
bubble(a4);
t = System.currentTimeMillis() - t;
System.out.println(t);
//System.out.println(Arrays.toString(a4));
System.out.println("Radix sort tests");
t = System.currentTimeMillis();
radix(n1, d1, a1);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
radix(n2, d1, a2);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
radix(n1, d2, a3);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
radix(n2, d2, a4);
t = System.currentTimeMillis() - t;
System.out.println(t);
System.out.println("Arrays.sort tests: ");
t = System.currentTimeMillis();
Arrays.sort(a1);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
Arrays.sort(a2);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
Arrays.sort(a3);
t = System.currentTimeMillis() - t;
System.out.println(t);
t = System.currentTimeMillis();
Arrays.sort(a4);
t = System.currentTimeMillis() - t;
System.out.println(t);
}
public static int[] insertion(int[] l) {
int list[] = l.clone();
int store;
int index;
long numC = 0;
long numA = 0;
boolean done;
for (int n=1; n<list.length; n++) {
index = 0;
done = false;
store = list[n];
for (int i=n-1; i>=0 && !done; i--) {
numC++;
if (store > list[i]) {
index = i+1;
done = true;
}
}
for (int j=n; j > index; j--)
list[j] = list[j-1];
list[index] = store;
numA++;
}
System.out.println("Number of comparisons: " + numC);
System.out.println("Number of assignments: " + numA);
return list;
}
public static int[] selection(int[] l) {
int list[] = l.clone();
int min;
int index;
long numC = 0;
long numSwaps = 0; //of min value, going to be n-1 swaps overall
for (int n=1; n<list.length; n++) {
min = list[n-1];
index = n-1;
for (int i=n; i<list.length; i++) {
numC++;
if (list[i] < min) {
min = list[i];
index = i;
numSwaps++;
}
}
list[index] = list[n-1];
list[n-1] = min;
}
System.out.println("Number of comparisons: " + numC);
System.out.println("Number of swaps: " + numSwaps);
return list;
}
public static int[] bubble(int[] l) { //Optimizations noted with comments
int[] list = l.clone();
int store = 0;
long numSwaps = 0;
long numRuns = 0;
for (int n=list.length-1; n > 0; n--) { //Need only n-1 swaps
//Last run puts lowest number in place for sure as well
for (int i=0; i < n; i++) { //We know digits past n are in order
if (list[i] > list[i+1]) {
store = list[i];
list[i] = list[i+1];
list[i+1] = store;
numSwaps++;
}
numRuns++;
}
}
System.out.println("Number of comparisons: " + numRuns);
System.out.println("Number of swaps: " + numSwaps);
return list;
}
public static int[] radix(int numItems, int numDigits, int[] list) {
int[] a = list.clone();
ArrayList[] buckets = new ArrayList[10];
Random r = new Random();
int digit;
int counter;
//for (int i=0; i<numItems; i++)
// a[i] = r.nextInt((int) Math.pow(10, numDigits));
for (int n=0; n<numDigits; n++) {
for (int i=0; i<10; i++)
buckets[i] = new ArrayList();
for (int i=0; i<numItems; i++) {
digit = (int)(a[i] / Math.pow(10, n)) % 10;
buckets[digit].add(a[i]);
}
counter = 0;
for (int i=0; i<10; i++) {
while (buckets[i].size() > 0) {
a[counter] = (Integer) buckets[i].get(0);
buckets[i].remove(0);
counter ++;
}
}
}
return a;
}
}