插入排序
一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 [2] 。
排序思想
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序 。
时间复杂度
在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为
O(N) 。
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(N^2)
。
平均来说,A[1…j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数 。
空间复杂度O(1)
插入排序的空间复杂度为常数阶
Java实现
public class InsertionSorter {
private int[] a;
public InsertionSorter(int []a) {
this.a=a;
}
public void sort() {
//假定第一个元素是已经排好序的,从第二个元素循环整个数组
for(int i=1; i<a.length; i++) {
//取出当前的值
int next = a[i];
//记录当前元素的索引
int j=i;
//循环将当前的值与前面的值进行比较,如果当前的值比前面元素的值小,则将前面的值后移,再将索引向前移动,直到移到数组开头索引0的位置
while( j>0 && a[j-1]>next ) {
a[j] = a[j-1];
j--;
}
//将当前的值放在合适的位置
a[j] = next;
}
}
}
``