package com.jwetherell.algorithms.sorts;
/**
* Insertion sort is a simple sorting algorithm: a comparison sort in which the
* sorted array (or list) is built one entry at a time. It is much less
* efficient on large lists than more advanced algorithms such as quicksort,
* heapsort, or merge sort.
*
* Family: Insertion.
* Space: In-place.
* Stable: True.
*
* Average case = O(n^2) Worst case = O(n^2) Best case = O(n)
*
* http://en.wikipedia.org/wiki/Insertion_sort
*
* @author Justin Wetherell <phishman3579@gmail.com>
*/
public class InsertionSort<T extends Comparable<T>> {
private InsertionSort() { }
public static <T extends Comparable<T>> T[] sort(T[] unsorted) {
int length = unsorted.length;
for (int i = 1; i < length; i++) {
sort(i, unsorted);
}
return unsorted;
}
private static <T extends Comparable<T>> void sort(int i, T[] unsorted) {
for (int j = i; j > 0; j--) {
T jthElement = unsorted[j];
T jMinusOneElement = unsorted[j - 1];
if (jthElement.compareTo(jMinusOneElement) < 0) {
unsorted[j - 1] = jthElement;
unsorted[j] = jMinusOneElement;
} else {
break;
}
}
}
}