public class SortAnalyzer {
    public static int[] numberArray() {
        int indexes = 5000;
        int[] arr = new int[indexes];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 10000);
        }
        return arr;
    }

    public static float[] main(String[] args) {
        int[] arr1 = numberArray();
        int[] arr2 = new int[5000];
        int[] arr3 = new int[5000];
        int[] arr4 = new int[5000];
        System.arraycopy(arr1, 0, arr2, 0, 500);
        System.arraycopy(arr1, 0, arr3, 0, 500);
        System.arraycopy(arr1, 0, arr4, 0, 500);
    
        float[] times = new float[4];
        String str = "";
    
        long start = System.nanoTime();
        bubbleSort(arr1);
        long end = System.nanoTime();
        str += ((end - start) + "ns | ");
        times [0] = (end - start);
    
        start = System.nanoTime();
        mergeSort(arr2);
        end = System.nanoTime();
        str += ((end - start) + "ns | ");
        times [1] = (end - start);
    
        start = System.nanoTime();
        selectionSort(arr3);
        end = System.nanoTime();
        str += ((end - start) + "ns | ");
        times [2] = (end - start);
    
        start = System.nanoTime();
        insertionSort(arr4);
        end = System.nanoTime();
        str += ((end - start) + "ns");
        times [3] = (end - start);
        System.out.println(str);
    
        return times;
    }
    
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
    
    public static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int current = arr[i];
            int j = i - 1;
            while (j >= 0 && current < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = current;
        }
    }
    
    public static void selectionSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
    
    public static void mergeSort(int[] arr) {
        if (arr.length > 1) {
            int[] left = leftHalf(arr);
            int[] right = rightHalf(arr);
    
            mergeSort(left);
            mergeSort(right);
    
            merge(arr, left, right);
        }
    }
    
    public static int[] leftHalf(int[] arr) {
        int size1 = arr.length / 2;
        int[] left = new int[size1];
        for (int i = 0; i < size1; i++) {
            left[i] = arr[i];
        }
        return left;
    }
    
    public static int[] rightHalf(int[] arr) {
        int size1 = arr.length / 2;
        int size2 = arr.length - size1;
        int[] right = new int[size2];
        for (int i = 0; i < size2; i++) {
            right[i] = arr[i + size1];
        }
        return right;
    }
    
    public static int[] merge(int[] result, int[] left, int[] right) {
        int i1 = 0;
        int i2 = 0;
    
        for (int i = 0; i < result.length; i++) {
            if (i2 >= right.length || (i1 < left.length && left[i1] <= right[i2])) {
                result[i] = left[i1];
                i1++;
            } else {
                result[i] = right[i2];
                i2++;
            }
        }
        return result;
    }
}

float[] means = new float[4];

for (int i = 0; i < 12; i++) {
    float[] a = SortAnalyzer.main(null);

    for (int j = 0; j < 4; j++) {
        means[j] += a[j];

    }
}

for (int i = 0; i < 4; i++) {
    means[i] /= 12;
    means[i] = Math.round(means[i] * 1000) / 1000;
}

System.out.println("Averages: ");
System.out.println("Bubble: " + means[0] + "ns");
System.out.println("Merge: " + means[1] + "ns");
System.out.println("Selection: " + means[2] + "ns");
System.out.println("Insertion: " + means[3] + "ns");
33529916ns | 910708ns | 13051666ns | 6209583ns
30882291ns | 305959ns | 19110000ns | 3155292ns
15200000ns | 216084ns | 4936083ns | 516500ns
11888333ns | 210875ns | 4939208ns | 515541ns
11881291ns | 207000ns | 4974500ns | 519292ns
14917084ns | 218250ns | 4923625ns | 518291ns
11978125ns | 210292ns | 4926250ns | 517666ns
11816625ns | 271667ns | 5036375ns | 516167ns
11853625ns | 209583ns | 4940000ns | 518208ns
11932083ns | 207125ns | 4975334ns | 519083ns
11755417ns | 200416ns | 4932667ns | 520583ns
11909542ns | 201542ns | 4928667ns | 534333ns
Averages: 
Bubble: 2147483.0ns
Merge: 280791.0ns
Selection: 2147483.0ns
Insertion: 1213378.0ns
import java.util.HashMap;
import java.lang.Integer;
import java.util.Scanner;

public class HashTest {
    public static void main(String[] args) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        int[] arr = new int[500000];

        for (int i = 0; i < 500000; i++) {
            Integer value = (int) (Math.random() * 500000);
            map.put(value, value);
            arr[i] = value;
        }
        double total_lut = 0;
        double total_bst = 0;

        // get num to search for from scanner
        Scanner sc = new Scanner(System.in);
        System.out.println("Search for a number: ");
        Integer num = sc.nextInt(); 

        for (int i = 0; i < 12; i++) {
            
            // check look up time for hash map
            String str = "|      ";
            long lut = (lookUp(map, num));
            total_lut += lut;
            str += (lut + "ns       |       ");
            
            // copy array, check binary search time
            int[] array1 = new int[500000];
            System.arraycopy(arr, 0, array1, 0, arr.length);
            long bst = (binarySearchTime(array1, num));
            total_bst += bst;
            str += (bst + "ns      | ");

            System.out.println(str);
        }

        System.out.println("Average: " + (total_lut / 12) + "ns | " + (total_bst / 12) + "ns");
    }

    public static long lookUp(HashMap<Integer, Integer> map, Integer value) {
        long start = System.nanoTime();
        map.containsKey(value);
        long end = System.nanoTime();
        return (end - start);
    }

    public static long binarySearchTime(int[] arr, Integer value) {
        long start = System.nanoTime();
        // binary search 
        int low = 0;
        int high = arr.length - 1;
        int mid = (low + high) / 2;
        while (low <= high) {
            if (arr[mid] < value) {
                low = mid + 1;
            } else if (arr[mid] == value) {
                break;
            } else {
                high = mid - 1;
            }
            mid = (low + high) / 2;
        }
        long end = System.nanoTime();
        return (end - start);
    }
}

HashTest.main(null);
Search for a number: 
|      1792ns       |       1958ns      | 
|      459ns       |       2084ns      | 
|      291ns       |       4708ns      | 
|      1417ns       |       2125ns      | 
|      458ns       |       2041ns      | 
|      458ns       |       1750ns      | 
|      416ns       |       2292ns      | 
|      625ns       |       1959ns      | 
|      542ns       |       1584ns      | 
|      291ns       |       1708ns      | 
|      375ns       |       1958ns      | 
|      417ns       |       1541ns      | 
Average: 628.4166666666666ns | 2142.3333333333335ns
public class LinkedList<T> {
    private T data;
    private LinkedList<T> prevNode, nextNode;

    /**
     *  Constructs a new element
     *
     * @param  data, data of object
     * @param  node, previous node
     */
    public LinkedList(T data, LinkedList<T> node)
    {
        this.setData(data);
        this.setPrevNode(node);
        this.setNextNode(null);
    }

    /**
     *  Clone an object,
     *
     * @param  node  object to clone
     */
    public LinkedList(LinkedList<T> node)
    {
        this.setData(node.data);
        this.setPrevNode(node.prevNode);
        this.setNextNode(node.nextNode);
    }

    /**
     *  Setter for T data in DoubleLinkedNode object
     *
     * @param  data, update data of object
     */
    public void setData(T data)
    {
        this.data = data;
    }

    /**
     *  Returns T data for this element
     *
     * @return  data associated with object
     */
    public T getData()
    {
        return this.data;
    }

    /**
     *  Setter for prevNode in DoubleLinkedNode object
     *
     * @param node, prevNode to current Object
     */
    public void setPrevNode(LinkedList<T> node)
    {
        this.prevNode = node;
    }

    /**
     *  Setter for nextNode in DoubleLinkedNode object
     *
     * @param node, nextNode to current Object
     */
    public void setNextNode(LinkedList<T> node)
    {
        this.nextNode = node;
    }


    /**
     *  Returns reference to previous object in list
     *
     * @return  the previous object in the list
     */
    public LinkedList<T> getPrevious()
    {
        return this.prevNode;
    }

    /**
     *  Returns reference to next object in list
     *
     * @return  the next object in the list
     */
    public LinkedList<T> getNext()
    {
        return this.nextNode;
    }

}


public class Stack<T> {

    private LinkedList<T> upper;
    private int size;

    public Stack() {
        this.upper = null;
        this.size = 0;
    }

    public void push(T data) {
        LinkedList<T> newNode = new LinkedList<T>(data, this.upper);
        this.upper = newNode;
        this.size++;
    }

    public T peek() {
        try {
            return this.upper.getData();
        } catch (NullPointerException e) {
            System.out.println("No upper element, empty stack!");
            return null;
        }
    }
 
    public T pop() {
        try {
            T data = this.upper.getData();
            this.upper = this.upper.getPrevious();
            this.size--;
            return data;
        } catch (NullPointerException e) {
            System.out.println("No upper element, empty stack!");
            return null;
        }
    }

    public int size() {
        return this.size;
    }

    public boolean isEmpty() {
        return this.size == 0;
    }

    public String toString() {
        String s = "[ ";
        LinkedList<T> currentNode = upper;
        while (currentNode != null) {
            s += currentNode.getData();
            currentNode = currentNode.getPrevious();
            if (currentNode != null) {
                s += ", ";
            }
        }
        s += " ]";
        return s;
    }

    public void bubbleSort() {
        if (this.size <= 1) {
            return;
        }

        Stack<T> sorted = new Stack<T>();

        while (!this.isEmpty()) {
            T temp = this.pop();

            while (!sorted.isEmpty() && ((Comparable<T>) sorted.peek()).compareTo(temp) > 0) { 
                this.push(sorted.pop());
            }

            sorted.push(temp);
        }

        while (!sorted.isEmpty()) {
            this.push(sorted.pop());
        }
    }
    
}


public class Tester {
    public static void main(String[] args) {
        Stack<Integer> s1 = new Stack<Integer>();

        s1.push(3);
        s1.push(4);
        s1.push(1);
        s1.push(2);
        s1.push(5);

        System.out.println(s1.toString());
        s1.bubbleSort();
        System.out.println(s1.toString());

    }
}

Tester.main(null);
[ 5, 2, 1, 4, 3 ]
[ 1, 2, 3, 4, 5 ]
public abstract class Collectable implements Comparable <Collectable> {
	public final String masterType = "Collectable";
	private String type;

	public interface KeyTypes {
		String name();
	}
	protected abstract KeyTypes getKey();

	public String getMasterType() {
		return masterType;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}
	
	public abstract String toString();

	public int compareTo(Collectable obj) {
		return this.toString().compareTo(obj.toString());
	}

	public static void print(Collectable[] objs) {

		if (objs.length > 0) {
			
			Collectable obj = objs[0];
			System.out.println(
					obj.getMasterType() + ": " + 
					obj.getType() +
					" listed by " +
					obj.getKey());
		}
		
		System.out.println("-------------------------");

		for(Object o : objs)
			System.out.println(o);

		System.out.println();
	}
}

public class SportsTeam extends Collectable {
	public static KeyTypes key = KeyType.name;
	public static void setOrder(KeyTypes key) {SportsTeam.key = key;}
	public enum KeyType implements KeyTypes {name, numMembers}

	private final String name;
	private final int numMembers;

	SportsTeam(String name, int numMembers)
	{
		this.setType("SportsTeam");
		this.name = name;
		this.numMembers = numMembers;
	}

	@Override
	protected KeyTypes getKey() { return SportsTeam.key; }


	@Override
	public String toString() {		
		String output = super.getType() + ": " + this.name + " has " + this.numMembers + " members.";
		return output;
	}

	// Test data initializer
	public static SportsTeam[] SportsTeamArray() {
		return new SportsTeam[]{
				new SportsTeam("Boston Red Sox", 26),
			    new SportsTeam("New York Yankees", 23),
				new SportsTeam("San Diego Padres", 28),
				new SportsTeam("Los Angeles Dodgers", 22),
				new SportsTeam("Atlanta Braves", 24),
				new SportsTeam("Chicago Cubs", 29),
				new SportsTeam("Houston Astros", 25)
		};
	}
	
	public static void main(String[] args)
	{
		SportsTeam[] objs = SportsTeamArray();  
		List<SportsTeam> SportsTeamArray = new ArrayList<SportsTeam>(Arrays.asList(objs));  

		SportsTeam.setOrder(KeyType.numMembers);
		SportsTeam.print(objs);

		SportsTeam.setOrder(KeyType.name);
		Collections.sort(SportsTeamArray); 
		SportsTeam.setOrder(KeyType.numMembers);
		for (SportsTeam team : SportsTeamArray)
			System.out.println(team);
	}
	
}
SportsTeam.main(null);
Collectable: SportsTeam listed by numMembers
-------------------------
SportsTeam: Boston Red Sox has 26 members.
SportsTeam: New York Yankees has 23 members.
SportsTeam: San Diego Padres has 28 members.
SportsTeam: Los Angeles Dodgers has 22 members.
SportsTeam: Atlanta Braves has 24 members.
SportsTeam: Chicago Cubs has 29 members.
SportsTeam: Houston Astros has 25 members.

SportsTeam: Atlanta Braves has 24 members.
SportsTeam: Boston Red Sox has 26 members.
SportsTeam: Chicago Cubs has 29 members.
SportsTeam: Houston Astros has 25 members.
SportsTeam: Los Angeles Dodgers has 22 members.
SportsTeam: New York Yankees has 23 members.
SportsTeam: San Diego Padres has 28 members.