美文网首页
[图解] 插入排序

[图解] 插入排序

作者: CoderJed | 来源:发表于2018-09-13 09:28 被阅读0次

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;

}

相关文章

  • iOS实现冒泡排序、快速排序、选择排序、希尔排序、插入排序等算法

    1、冒泡排序 图解: 2、选择排序 图解: 3、快速排序 图解: 4、插入排序 图解: 5、希尔排序 图解: 6、...

  • java快速学习排序---插入排序

    1.java实现插入排序 (1)、图解插入排序 (2)、插入排序的思想 (3)、插入排序的代码实现

  • [图解] 插入排序

    1. 图示过程 2. 动图展示 3. 文字叙述过程 第1趟插入:将第2个元素插入前面的有序子序列,此时前面只有一个...

  • 希尔排序

    图解算法---希尔排序 前情回顾:直接插入排序(对插入排序不熟悉的建议先阅读此文) 一天,一尘拿着扑克自己在那玩,...

  • 排序

    图解:C语言入门:插入排序(代码实现,而不是排序方法阐述) - Rivival_S 的博客 - CSDN博客 插入...

  • 排序算法2:插入排序

    一、直接插入排序 1.算法思想及图解 (1)算法的思想 当对位置 i 处的元素进行排序时,[0,i-1]上的元素一...

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

  • 数据结构c-直接插入排序-图解

    插入排序的基本思想是:将第i个元素插入到第i-1个前面已经排好序的集合中。 图解 假设我们有个数组是[48, 62...

  • c算法O(n)^2(一)

    选择排序 插入排序 优化插入排序算法

  • 一遍文章搞定插入排序-java版

    插入排序 1.1 插入排序的基本介绍 插入排序属于内排,就是以插入的方式来达到排序的目的 1.2 插入排序思想 将...

网友评论

      本文标题:[图解] 插入排序

      本文链接:https://www.haomeiwen.com/subject/frdbgftx.html