优化版2:
优化部分是,旧版每次比前1个小的时候都要交换值1次。优化之后,先把当前值存变量,让它和前一个比较,比它大就往后挪,直到不符合条件,就跳出循环,把它放在当前位置。
public void test0(){
int[] a = {9,3,1,4,6,8,7,5,2};
for(int i=1;i<a.length;i++){
int temp=a[i];
int j=i;
for(;j>0&&temp<a[j-1];j--){
a[j]=a[j-1];
}
a[j]=temp;
}
System.out.println(Arrays.toString(a));
}
优化版
注意:
for(;j>0;j--){
if(temp<a[j-1]){
a[j]=a[j-1];
}
}
这种写法和上面的在执行上有不一样的地方,因为插入排序,执行当前位置的时候,前面几个的顺序已经排好了,所以只要当前这个比前一个大的话,第2层for循环就会停止。但如果把if语句写在里面,依然会继续执行,直到第a[1]和a[0]比较完毕,第2层for循环才会停止。
原始版的插入排序:
public void test1(){
int[] a = {9,3,1,4,6,8,7,5,2};
for(int i=1;i<a.length;i++){
for(int j=i;j>0;j--){
if(a[j]<a[j-1]){
swap(a,j-1,j);
}
}
}
System.out.println(Arrays.toString(a));
}
public void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
优化版1:将if条件放进for循环的条件里,因为前面的顺序已经排好,只要比前1个大,就可以不用循环了,说明前面都是小的。
public void test1(){
int[] a = {9,3,1,4,6,8,7,5,2};
for(int i=1;i<a.length;i++){
for(int j=i;j>0 &&a[j]<a[j-1];j--){
swap(a,j-1,j);
}
}
System.out.println(Arrays.toString(a));
}
如果觉得《排序算法 冒泡排序 插入排序》对你有帮助,请点赞、收藏,并留下你的观点哦!