记排序算法(3) - 插入排序

77 阅读1分钟

算法描述

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法流程如下

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

动画展示

insertion.gif

代码实现

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = CommonStant.arr; // int[] arr = new int[]{1,3,4,7,9,0,12,41,4,68,1,2,4};
        int length = arr.length;
        for (int i = 1; i < length; i++) {
            int value = arr[i];
            int position = i;
            while (position > 0 && value < arr[position - 1]) {
                arr[position] = arr[position - 1];
                position--;
            }
            arr[position] = value;
        }
        Arrays.stream(arr).forEach(System.out::println);
    }
}

总结

稳定性:算法稳定,冒泡排序在排序前后两个相等的数相对位置不变。 时间复杂度:O(n^2),最好情况O(n), 最坏情况O(n^2)。 空间复杂度:O(1),不需要额外的变量进行存储。