插入排序
插入排序和选择排序都有相同点,就是将整个数组划分成两个部分,一个是已排序的部分,另一个是未排序的部分。
插入排序开始会将索引0的部分视为已排序的部分
,后面的视为未排序的部分
,不断扩大有序区域,缩减无需区域,首先会把有序区域后一位空出来
,再将原先的三插入到有序的部分相应的位置。
后面继续循环前边操作。
插入排序是一个稳定的排序算法,选择排序是不稳定的,性能高于选择排序,对已排序的部分更高效。
这里实现只需要将后面的元素与已排序数组的最前面的元素进行比较,直至不需要交换即可退出循环。
算法描述
- 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
- 重复以上步骤,直到整个数组有序
public class InsertSort {
public static void main(String[] args) {
int[] a = {9,3,7,2,5,8,1,4};
insert(a);
System.out.println(Arrays.toString(a));
}
public static void insert(int[] a){
//从1开始,即第一个元素不需要进行,表示已排好序,i代表待插入元素的索引
for (int i = 1; i < a.length; i++) {
int tem=a[i]; //临时变量,代表待插入的值
int j = i-1; //代表已排序区域的元素索引
while (j>=0){
if (tem <a[j]){
a[j+1]=a[j]; //若待插入区域值小于已排序区域的值,则需要将大的值向后移,并继续向更深层比较
}else {
break;//若待插入的元素大于已排序区域最大元素,就不需要比较了,因为是有序的,减少排序次数
}
j--;
}
a[j+1]=tem; //将待插入的值插入到空出来的区域里
System.out.println("第"+i+"轮插入结果:"+Arrays.toString(a));
}
}
}
与选择排序比较
-
二者平均时间复杂度都是 O ( n 2 ) O(n^2) O(n2)
-
大部分情况下,插入都略优于选择
-
有序集合插入的时间复杂度为 O ( n ) O(n) O(n)
-
插入属于稳定排序算法,而选择属于不稳定排序
提示
插入排序通常被同学们所轻视,其实它的地位非常重要。小数据量排序,都会优先选择插入排序
缺点就是较大的元素在元素最前面时,移动次数会比较多