原理
从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。
在实际的算法中,我们经常选择序列的第一个元素作为有序序列(因为一个元素肯定是有序的),我们逐渐将后面的元素插入到前面的有序序列中,直到整个序列有序。
实现
public class 简单插入 {
public void simple_sort(int [] a) {
int temp=0;//哨兵
int i=1;
int j=0;
int len=a.length;
for(;i<len;i++)
{
temp=a[i];
j=i-1;
//注意此处两个条件的顺序
while(j>-1 && temp<a[j])//有序序列最后一个值大于哨兵,就把该值往后挪一个位置
{ //然后与前一个有序值比较
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}
public static void main(String[] args) {
int [] a= new int[]{10,6,3,5,2,9,1,4,7,8};
简单插入 simple=new 简单插入();
simple.simple_sort(a);
for (int i : a) {
System.out.println(i);
}
}
}
总结
稳定性:
例如2,1a,1b,3
第一次排序后位1a,2,1b,3
第二次排序后为1a,1b,2,3
相同元素的位置不会被打乱,所以是稳定的。
时间复杂度:
最坏情况:
倒序情况下,每次放在最前面,交换1+…+n2=(1+n)n/2,为O(n2)次
最好情况:
有序情况下,每次放在最后,只需n次,为O(n)
平均时间复杂度为:
O(N2)
空间复杂度:
只需要一个交换用的临时空间,为O(1)。