import java.io.*;
import java.util.*;
public class Sort {
private ArrayList[] buckets = new ArrayList[10];
private int[] a;
private int power, nums, comp, swap;
public Sort(int p, int n) {
power = p;
nums = n;
a = new int[n];
}
public void makeArray() {
Random r = new Random();
for(int i=0; i<nums; i++) {
a[i] = r.nextInt((int)(Math.pow(10,power)-1));
}
}
public void radixSort() {
for(int i=0; i<power; i++) {
for(int bucket = 0; bucket<10; bucket++){
buckets[bucket] = new ArrayList();
}
for(int j=0; j<10; j++) {
int num = a[j];
int n = num/((int)(Math.pow(10,i)))%10;
buckets[n].add(num);
}
int k = 0;
for(int l=0; l<10; l++) {
for(int m=0; m<buckets[l].size(); m++) {
int o = (Integer)(buckets[l].get(m));
a[k] = o;
k++;
}
}
}
}
public void bsort() {
for (int i=0; i<nums; i++) {
for (int j=0; j<nums-1-i; j++) { //optimized from 0 to nums-1
comp++;
if (a[j] > a[j+1]) {
swap++;
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
public static void main(String args[]) {
Sort s1 = new Sort(3,50);
System.out.println(s1.power + " digit ints in a " + s1.nums + " int long array");
System.out.println("Radix Sort:");
s1.makeArray();
System.out.println("Array: " + Arrays.toString(s1.a));
long starttime11 = System.currentTimeMillis();
s1.radixSort();
long endtime11 = System.currentTimeMillis();
long elapsed11 = endtime11-starttime11;
System.out.println("Sorted Array: " + Arrays.toString(s1.a));
System.out.println("Radix Sort took " + elapsed11);
System.out.println();
System.out.println("Bubble Sort:");
s1.makeArray();
System.out.println("Array: " + Arrays.toString(s1.a));
long starttime12 = System.currentTimeMillis();
s1.bsort();
long endtime12 = System.currentTimeMillis();
long elapsed12 = endtime12-starttime12;
System.out.println("Sorted Array: " + Arrays.toString(s1.a));
System.out.println("Bubble Sort took " + elapsed12);
System.out.println("Comparisons: " + s1.comp + "; Swaps: " + s1.swap);
System.out.println("-----------------------------");
Sort s2 = new Sort(5,50);
System.out.println(s2.power + " digit ints in a " + s2.nums + " int long array");
System.out.println("Radix Sort:");
s2.makeArray();
System.out.println("Array: " + Arrays.toString(s2.a));
long starttime21 = System.currentTimeMillis();
s2.radixSort();
long endtime21 = System.currentTimeMillis();
long elapsed21 = endtime21-starttime21;
System.out.println("Sorted Array: " + Arrays.toString(s2.a));
System.out.println("Radix Sort took " + elapsed21);
System.out.println();
System.out.println("Bubble Sort:");
s2.makeArray();
System.out.println("Array: " + Arrays.toString(s2.a));
long starttime22 = System.currentTimeMillis();
s2.bsort();
long endtime22 = System.currentTimeMillis();
long elapsed22 = endtime22-starttime22;
System.out.println("Sorted Array: " + Arrays.toString(s2.a));
System.out.println("Bubble Sort took " + elapsed22);
System.out.println("Comparisons: " + s2.comp + "; Swaps: " + s2.swap);
System.out.println("-----------------------------");
Sort s3 = new Sort(7,50);
System.out.println(s3.power + " digit ints in a " + s3.nums + " int long array");
System.out.println("Radix Sort:");
s3.makeArray();
System.out.println("Array: " + Arrays.toString(s3.a));
long starttime31 = System.currentTimeMillis();
s3.radixSort();
long endtime31 = System.currentTimeMillis();
long elapsed31 = endtime31-starttime31;
System.out.println("Sorted Array: " + Arrays.toString(s3.a));
System.out.println("Radix Sort took " + elapsed31);
System.out.println();
System.out.println("Bubble Sort:");
s3.makeArray();
System.out.println("Array: " + Arrays.toString(s3.a));
long starttime32 = System.currentTimeMillis();
s3.bsort();
long endtime32 = System.currentTimeMillis();
long elapsed32 = endtime32-starttime32;
System.out.println("Sorted Array: " + Arrays.toString(s3.a));
System.out.println("Bubble Sort took " + elapsed32);
System.out.println("Comparisons: " + s3.comp + "; Swaps: " + s3.swap);
System.out.println("-----------------------------");
//bubble sort starts getting much slower than radix over here
Sort s4 = new Sort(2000,1000000);
System.out.println(s4.power + " digit ints in a " + s4.nums + " int long array");
System.out.println("Radix Sort:");
s4.makeArray();
//System.out.println("Array: " + Arrays.toString(s4.a));
long starttime41 = System.currentTimeMillis();
s4.radixSort();
long endtime41 = System.currentTimeMillis();
long elapsed41 = endtime41-starttime41;
//System.out.println("Sorted Array: " + Arrays.toString(s4.a));
System.out.println("Radix Sort took " + elapsed41);
System.out.println();
System.out.println("Bubble Sort:");
s4.makeArray();
//System.out.println("Array: " + Arrays.toString(s4.a));
long starttime42 = System.currentTimeMillis();
s4.bsort();
long endtime42 = System.currentTimeMillis();
long elapsed42 = endtime42-starttime42;
//System.out.println("Sorted Array: " + Arrays.toString(s4.a));
System.out.println("Bubble Sort took " + elapsed42);
System.out.println("Comparisons: " + s4.comp + "; Swaps: " + s4.swap);
System.out.println("-----------------------------");
Sort s5 = new Sort(500000,500000000);
System.out.println(s5.power + " digit ints in a " + s5.nums + " int long array");
System.out.println("Radix Sort:");
s5.makeArray();
//System.out.println("Array: " + Arrays.toString(s5.a));
long starttime51 = System.currentTimeMillis();
s5.radixSort();
long endtime51 = System.currentTimeMillis();
long elapsed51 = endtime51-starttime51;
//System.out.println("Sorted Array: " + Arrays.toString(s5.a));
System.out.println("Radix Sort took " + elapsed51);
System.out.println();
System.out.println("Bubble Sort:");
s5.makeArray();
//System.out.println("Array: " + Arrays.toString(s5.a));
long starttime52 = System.currentTimeMillis();
s5.bsort();
long endtime52 = System.currentTimeMillis();
long elapsed52 = endtime52-starttime52;
//System.out.println("Sorted Array: " + Arrays.toString(s5.a));
System.out.println("Bubble Sort took " + elapsed52);
System.out.println("Comparisons: " + s5.comp + "; Swaps: " + s5.swap);
}
}