参考:插入排序——基本插入排序与希尔排序(不带哨兵)
含义:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序(升序)
①先将第2个元素看作是有序区间,第二个元素开始后的元素看作未排序列,第一个作为哨兵;
②从第3个元素开始直至最后,先让待排数据与前面的有序区间的最后一个数据进行比较, 直到其插入到有序区间的合适位置(即,插入后有序区间保持有序) ;
/**
* 直接插入
*/
public void MyInsertSort(int a[]){
int i,j;
for(i=1+1;i<a.length;i++){
//a[0]作为哨兵,a[1]作为初始有序,i=1+1是为了后面希尔排序好理解
if(a[i]<a[i-1]){
a[0]=a[i];//设置哨兵
for(j=i-1; a[j]>a[0];j--){
a[j+1]=a[j];//记录后移
}
a[j+1]=a[0];//插入
}
}
}
时间复杂度:
我们以将序列排为升序为前提
先看最好的情况,序列已经是升序的,在这种情况下,需要进行的比较操作为n-1次;
最坏的情况,序列为降序序列,那此时需要进行的比较次数为n(n-1)/2次。
因此,平均来说,插入排序算法时间复杂度为O(n^2),因而,插入排序不适合数据量比较大的排序应用。
直接插入中哨兵作用
希尔排序(升序)
希尔排序(Shell Sort)又称为“缩小增量排序”。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的