As in selection sort, the items to the left of the current index are in sorted order during the sort, but they are not in their final position, as they may have to be moved to make room for smaller items encountered later. The array is, however, fully sorted when the index reaches the right end.
Unlike that of selection sort, the running time of insertion sort depends on the initial order of the items in the input. For example, if the array is large and its entries are already in order (or nearly in order), then insertion sort is much, much faster than if the entries are randomly ordered or in reverse order.
Time complexity:
Insertionsortuses ~N^2 /4 compares and ~N^2/4 exchanges to sort a randomly ordered array of length N with distinct keys, on the average. The worst case is ~N^2/2 compares and ~N^2/2 exchanges and the best case is N - 1 compares and 0 exchanges.
Insertion sort works well for certain types of nonrandom arrays that often arise in practice, even if they are huge. For example, as just mentioned, consider what happens when you use insertion sort on an array that is already sorted. Each item is immediately determined to be in its proper place in the array, and the total running time is linear. (The running time of selection sort is quadratic for such an array.)
public class Insertion { // use natural order and Comparable interface public static void sort(Comparable[] a) { int N = a.length; for (int i = 0; i < N; i++) { //showGUI(a); for (int j = i; j > 0 && less(a[j], a[j-1]); j--) { exch(a, j, j-1); // showGUI(a); } assert isSorted(a, 0, i); } assert isSorted(a); } // use a custom order and Comparator interface - see Section 3.5 public static void sort(Object[] a, Comparator c) { int N = a.length; for (int i = 0; i < N; i++) { for (int j = i; j > 0 && less(c, a[j], a[j-1]); j--) { exch(a, j, j-1); } assert isSorted(a, c, 0, i); } assert isSorted(a, c); } // return a permutation that gives the elements in a[] in ascending order // do not change the original array a[] public static int[] indexSort(Comparable[] a) { int N = a.length; int[] index = new int[N]; for (int i = 0; i < N; i++) index[i] = i; for (int i = 0; i < N; i++) for (int j = i; j > 0 && less(a[index[j]], a[index[j-1]]); j--) exch(index, j, j-1); return index; } /*********************************************************************** * Helper sorting functions ***********************************************************************/ // is v < w ? private static boolean less(Comparable v, Comparable w) { return (v.compareTo(w) < 0); } // is v < w ? private static boolean less(Comparator c, Object v, Object w) { return (c.compare(v, w) < 0); } // exchange a[i] and a[j] private static void exch(Object[] a, int i, int j) { Object swap = a[i]; a[i] = a[j]; a[j] = swap; } // exchange a[i] and a[j] (for indirect sort) private static void exch(int[] a, int i, int j) { int swap = a[i]; a[i] = a[j]; a[j] = swap; } /*********************************************************************** * Check if array is sorted - useful for debugging ***********************************************************************/ private static boolean isSorted(Comparable[] a) { return isSorted(a, 0, a.length - 1); } // is the array sorted from a[lo] to a[hi] private static boolean isSorted(Comparable[] a, int lo, int hi) { for (int i = lo + 1; i <= hi; i++) if (less(a[i], a[i-1])) return false; return true; } private static boolean isSorted(Object[] a, Comparator c) { return isSorted(a, c, 0, a.length - 1); } // is the array sorted from a[lo] to a[hi] private static boolean isSorted(Object[] a, Comparator c, int lo, int hi) { for (int i = lo + 1; i <= hi; i++) if (less(c, a[i], a[i-1])) return false; return true; } // print array to standard output private static void show(Comparable[] a) { for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } }