插入排序是非常好理解的。看图:
注意,这里比较是从最后一个元素往前比较,如果当前的元素比上一个大,那么比较和交换的工作就此停止。如果是每次都从第一位开始比较的话,那么无论是否已经排好顺序,总是会比较n-1个元素,次数上是会比这种方法多的。
代码如下:
public class InsertionSort { /** * 从第一个元素开始,与前面的元素进行比较 * 如果当前元素大于上一个元素,那么比较停止,进入下一轮 * 如果当前元素小于上一个元素,那么交换该元素与上一个元素,继续与之前的比较,一直到array[0] * * @param array */ public static void sort(int[] array) { if (array == null || array.length < 2) { return; } for (int i = 1; i < array.length; i++) { for (int j = i; j >= 1; j--) { if (array[j] >= array[j - 1]) { break; } Common.swampValue(array, j, j - 1); } } } public static void main(String[] args) { int[] array = {2, 3, 1, 4, 2, 44, 32, 13, 12, 56, 32, 12, 33, 21, 15, 16, 76, 45, 32, 33, 121, 123, 123, 122}; sort(array); System.out.println("Arrays.toString(array) = " + Arrays.toString(array)); } }
插入排序的最优情况就是完全顺序或者完全相等,那么当前元素与上一个比较之后就进入下一轮,时间复杂度为O(n)。最差情况就是倒序,时间复杂度为O(n^2),平均复杂度也为O(n^2)。空间复杂度由于每次都是一一比较交换,所以复杂度为O(1)。