排序算法的一种,方法如其名.在一个有序的序列的基础上插入一个新元素从而生成一个新的有序数列的排序方法.时间复杂度O(n2).
插入排序又可细分为,直接插入排序,二分插入排序,希尔排序等等.演示范例使用的方法是直接插入排序.
例:
数组 a = [ 9,2,4,6,11,3,55] 使用插入排序,总计7个元素
第一次: [2,9,4,6,11,3,55] 第一次排序完毕结果,使用的比较数字 "2"(角标1).
过程:2和9比较2比9小,到达边界,有序序列[2,9]
结果:排序完毕可以保证前2个元素的有序性.
第二次: [2,4,9,6,11,3,55] 第二次排序完毕结果,使用的比较数字 "4"(角标2).
过程:4和9比,4小,4和2比,4大,4插入2和9中间,有序系列[2,4,9]
结果:排序完毕可以保证前3个元素的有序性
第三次: [2,4,6,9,11,3,55] 第三次排序完毕结果,使用的比较数字 "6"(角标3).
过程:6和9比,6小,6和4比,6大,6插入4和9中间,有序序列[2,4,6,9]
结果:排序完毕可以保证前4个元素的有序性.
第四次: [2,4,6,9,11,3,55] 第四次排序完毕结果,使用的比较数字 "11"(角标4).
过程:11和9比,11大,11插入9后面,有序序列[2,4,6,9,11].
结果:排序完毕可以保证前5个元素的有序性.
第五次: [2,3,4,6,9,11,55] 第五次排序完毕结果,使用的比较数字 "3"(角标5).
过程:3和11比,3小,3和9比,3小,3和6比,3小,3和4比,3小,3和2比,3大,3插入2和4之间,有序数列[2,3,4,6,9,11],.
结果:排序完毕可以保证前6个元素的有序性.
第六次: [2,3,4,6,9,11,55] 第六次排序完毕结果,使用的比较数字 "55"(角标6).
过程:55和11比,55大,55插入11后面,有序序列[2,3,4,6,9,11,55],.
结果:排序完毕可以保证前7个元素的有序性.
排序完毕
结论:对于长度为n的数组,使用插入排序,可以保证在第p次(0< p <n) 排序完成以后,前p+1个元素有序.
细节: 在第p次进行排序的过程中,比较元素为a[p],有序序列为a[0]~a[p-1],因为0 ~ p-1 个元素是有序的,所以a[p]不需要和之前的p-1个元素全部进行比较,只要找到比自己小的元素,然后插入到其后即可.
1 public static <AnyType extends Comparable<? super AnyType>> void insertSort(AnyType[] source) { 2 for (int startIndex = 1; startIndex < source.length; startIndex++) { 3 AnyType compareEle = source[startIndex]; 4 int swapIndex; 5 for (swapIndex = startIndex; swapIndex > 0 && compareEle.compareTo(source[swapIndex - 1]) < 0; swapIndex--) 6 source[swapIndex] = source[swapIndex - 1]; 7 source[swapIndex] = compareEle; 8 } 9 }