三大简单排序之一:插入
什么是插入
顾名思义,就是从序列中拿到更小的元素插入到前面。
往前检索,如果有比前面有序序列中更小的数,就将该数插入到小于刚好大于该数的元素的前面。
具体实现
- 将数组分为两个部分,左边是已经排序好的,右边是未排序好的
- 从右边未排序数组中取出一个元素插入到左边数组中
- 这个元素和左边元素进行比较,如果比左边元素小,就将左边元素交换,即将左边元素往后移一位,如果比左边元素大就停止左移。
- 依次以上步骤,直到右边数组元素全部插入到左边。
插入排序关键在于将待插入元素往前比较,且看以下动态图
代码实现
public class InsertSort {
public static void main(String[] args) {
int[] arr = {5,3,2,4,1,6,2};
insertSort(arr);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
public static void insertSort(int[] arr){
for (int j=1;j<arr.length;j++) {
// 获取插入的元素
int insertNum = arr[j];
// 遍历已经排序的数组,从后往前遍历
for (int i = j; i >= 0; i--) {
// 和前面的元素依次比较
if (i > 0 && arr[i-1] > insertNum) {
// 插入元素小于遍历到的元素,将遍历到的元素往后移动
arr[i] = arr[i - 1];
} else {
// 若插入元素大于遍历的元素,将插入元素赋值给该位置
arr[i] = insertNum;
break;
}
}
}
}
}
打印输出数组arr,得到结果如下
1,2,2,3,4,5,6,
算法复杂度
- 插入排序,是比较少,交换次数多的排序
- 时间复杂度:O(n^2)