插入排序是最简单排序算法之一.
算法分析
插入排序由N-1趟排序组成,对于p=1到N-1趟,插入排序保证位置0到位置p-1之间的位置是已排好序的,在第p趟,在p位置上的数据会向左移动,知道找到正确的位置.
假设有以下待排序数字: 16, 8 , 13, 36, 28, 14
p=1时, 要排序的数字为8,排序之后的顺序为 : 8, 16, 13, 36, 28, 14, 移动了1次
p=2时, 要排序的数字为13,排序之后的顺序为 : 8, 13, 16, 36, 28, 14,移动了1次
p=3时, 要排序的数字为36,排序之后的顺序为 : 8, 13, 16, 36, 28, 14,移动了0次
p=4时, 要排序的数字为28,排序之后的顺序为 : 8, 13, 16, 28, 36, 14,移动了1次
p=5时, 要排序的数字为14,排序之后的顺序为 : 8, 13, 14, 16, 28, 36,移动了3次
最终排序好的数字顺序: 8, 13, 14, 16, 28, 36
Java代码演示
public static <AnyType extends Comparable<? super AnyType>> void insertSort(AnyType[] a) {
int j;
for (int p = 1; p < a.length; p++) {
AnyType tmp = a[p]; /*tmp记录p位置上的数据*/
for (j = p; j > 0 && tmp.compareTo(a[j - 1]) < 0; j--) {/*碰到左边的值小于或等于tmp时,结束本次循环*/
a[j] = a[j - 1]; /*比tmp大的往后移*/
}
a[j] = tmp; /*赋值到正确的位置*/
}
}
1:先用局部变量记录p位置的值
2:与p-1的位置开始比较,如果比p-1位置的值小,则p-1位置的值往后移动一位;否则直接结束本次内部循环
3:最后p位置的值赋给正确的位置
时间复杂度
对于第p趟的比较最多p次,有1+2+3+4+….+n,则时间复杂度为O(n^2).
实际上,若是数据之前已排过续,则时间复杂度为O(n),因为第二个循环中的校验始终不成立而结束内部循环.
所以,如果要排序一串大多数已排好序的数据,插入排序还是很快的.