源代码
public class Main {
public static void main(String[] args) {
int[] a={20,30,21,35,2,1};
//insertSort(a);
insertSortWithLookOut(a);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
//不带监视哨
public static void insertSort(int[] a){
int j;
for(int i=1;i<a.length;i++){
if(a[i]<a[i-1]){
int temp=a[i]; //没有监视哨,将a[i]存入变量temp中
for(j=i-1;j>=0 && a[j]>temp;j--){ //每次都要比较j>=0,需要考虑界限的问题
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
}
//带监视哨,用该方法时,数组0下标可以设置值为零,遍历数组从下标为1开始
public static void insertSortWithLookOut(int[] a){
int j;
for(int i=2;i<a.length;i++){
if(a[i]<a[i-1]){
a[0]=a[i]; //将a[i]存入a[0]这个监视哨中
for(j=i-1;a[j]>a[0];j--){ //不用每次都要比较j>=0,不用考虑界限问题,数据量大的情况下该方法效率高
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}
}
}
性能相关分析
![空间效率:O(1)时间效率:排序过程中,会进行n-1次插入,每次分为比较元素和移动元素;最好:初始有序的元素,只需要比较n-1次元素,不需要移动元素,时间复杂度O(n);](https://i-blog.csdnimg.cn/blog_migrate/0ebadbf1805ea6164156a2d2387d0e87.png)