[图解] 插入排序

1. 图示过程

插入排序图示

2. 动图展示

3. 文字叙述过程

  • 第1趟插入:将第2个元素插入前面的有序子序列,此时前面只有一个元素,当然是有序的
  • 第2趟比较:将第3个元素插入前面的有序子序列,前面的2个元素是有序的
  • ......
  • 第n-1趟比较:将第n个元素插入前面的有序子序列,前面n-1个元素是有序的

4. Java代码实现

public static void insertionSort(int[] nums) {

    if (nums == null || nums.length < 2) {
        return;
    }

    for(int i = 1; i < nums.length; i++) {
        for(int j = i - 1; j >= 0 && nums[j] > nums[j + 1]; j--) {
            ArrayUtils.swap(nums, j, j + 1);
        }
    }

}
public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

5. 复杂度

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1),只需要一个额外空间用于交换
  • 稳定性:插入排序是稳定的排序算法,满足条件nums[j] > nums[j + 1]才发生交换,这个条件可以保证值相等的元素的相对位置不变。

6. 优化

上面的算法的缺点:在第i-1趟插入时,需要把第i个元素插入到前面的i-1个元素中,该算法总是从i-1个元素开始逐个比较之前的每个元素,直到找到第i个元素的插入位置,这显然没有利用前面0~i-1个元素已经有序的特点

优化:在0~i-1个有序元素给第i个元素寻找插入的位置时,使用二分查找法可以有效提高查找插入位置的时间效率,经过优化的插入排序称为折半插入排序,折半插入排序的时间复杂度为O(n*logn)

/**
 * 折半插入排序
 */
public static void binaryInsertionSort(int[] nums) {

    if (nums == null || nums.length < 2) {
        return;
    }

    for(int i = 1; i < nums.length; i++) {
        int temp = nums[i];
        // 通过二分查找找到插入的位置
        int insertIndex = findInsertIndex(nums, 0, i - 1, nums[i]);
        // 插入位置之后的元素依次向后移动
        for(int j = i; j > insertIndex; j--) {
            nums[j] = nums[j - 1];
        }
        // 更新插入位置的值
        nums[insertIndex] = temp;
    }

}

/**
 * 在有序数组 nums 的[L, R]部分上,找到 value 的插入位置
 */
public static int findInsertIndex(int[] nums, int L, int R, int value) {

    while(L <= R) {
        int mid = L + ((R - L) / 2);
        if(value > nums[mid]) {
            L = mid + 1;
        } else {
            R = mid - 1;
        }
    }

    return L;

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,518评论 1 4
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,755评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,248评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,293评论 0 2
  • 满天繁星中的空灵少女,她是不忘初心的灿烂校花。年度电视剧最佳女演员-郑爽。 从十七岁签约天娱,到如今的二十四岁,郑...
    gdtchjfv阅读 3,731评论 51 65