排序算法系列文章
排序(一):冒泡排序
排序(二):选择排序
排序(三):堆排序
排序(四):插入排序
排序(五):二分搜索
排序(六):归并排序
排序(七):快速排序
排序(八):希尔排序
插入排序(Insertion Sort)
基本思想
把n个待排序的元素看成为一个有序数组和一个无序数组。开始时有序数组中只包含一个元素,无序数组中包含有n-1个元素,排序过程中每次从无序数组中取出第一个元素,把它依次与有序数组的元素进行比较,将它插入到有序数组中的适当位置,使之成为新的有序数组,直到最后无序数组没有元素为止。
算法步骤
①在执行过程中,插入排序会将序列分为2部分
- 头部是已经排好序的,尾部是待排序的
②从头开始扫描每一个元素
- 每当扫描到一个元素,就将它插入到头部合适的位置,使得头部数据依然保持有序
复杂度
- 插入排序的平均时间复杂度是 O(n^2),空间复杂度为 O(1)
- 最好时间复杂度为O(n),最坏时间复杂度为 O(n^2)
- 插入排序算法是稳定的
代码实现
public class InsersionSort {
public static void main(String[] args) {
int[] array = {10,9,19,28,37,34,5};
InsertionSort1(array);
for (int i : array){
System.out.println(i + " ");
}
}
public static void InsertionSort1(int[] array){
//从 1 开始,将 0 位置的元素当作已经有序的元素
for (int begin = 1; begin < array.length; begin++) {
//选择插入排序的数,保存为num
int num = array[begin];
//计算 num 前一个数的索引
int preIndex = begin - 1;
for(;preIndex >= 0; preIndex--){
//进行检查,如果num小于前面的数,则将前一个数往后移
//若比前一个数大,则结束此次循环
if (num < array[preIndex]){
array[preIndex + 1] = array[preIndex];//前面的数往后移动一位
}else{
break;
}
}
//结束时的位置保存num
if (num != array[begin]){//说明移动了位置,需要插入
array[preIndex + 1] = num;//将作为比较的数插入数组中,形成新的片段有序数组
}
}
}
}