插入排序超详细

1、什么是插入排序?

插入排序的原理:

一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

选择排序的基本思想是:

将未排序的元素一个一个地插入到有序的集合中,插入时把所有有序集合从后向前扫一遍,找到合适的位置插入。

2、插入排序到底是如何排序的呢?

下面通过一个动图来看一看插入排序到底是怎么样移动的

在这里插入图片描述

具体是如何移动的呢?

(1)举个例子,比如我手中有3,5,8,9这四张牌,已经处于升序排列:

在这里插入图片描述


(2)这时候,我又抓到了一张红桃7,如何让手中的五张牌重新变成升序呢?用冒泡排序,选择排序,亦或是快速排序?

在这里插入图片描述

(3)最自然也最简单的方式,是在已经有序的四张牌中找到红桃7应该插入的位置,也就是8和9之间,把红桃7插入进去:

在这里插入图片描述

小明:就像玩牌一样,插入排序算法也是类似思想:维护一个有序区间,把元素一个一个插入到有序区间的适当位置,直到所有元素有序为止。
小花:好像明白了一点,那插入排序在数组中具体如何进行的呢?
小明:让我来演示一下插入排序具体步骤吧:

给定无序数组如下:

图片

把数组的首元素5作为有序区,此时有序区只有这一个元素:

图片

在这里插入图片描述

第一轮

让元素8和有序区的元素依次比较。

8>5,所以元素8和元素5无需交换。

此时有序区的元素增加到两个:

图片

第二轮

让元素6和有序区的元素依次比较。

6<8,所以把元素6和元素8进行交换:

图片

6>5,所以把元素6和元素5无需交换。

此时有序区的元素增加到三个:

图片

第三轮

让元素3和有序区的元素依次比较。

3<8,所以把元素3和元素8进行交换:

图片

3<6,所以把元素3和元素6进行交换:

图片

3<5,所以把元素3和元素5进行交换:

图片

此时有序区的元素增加到四个:

图片

以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:

图片

小明:你有没有发现其实上面的排序过程可以进一步优化的
小花:比如呢?
小明:当我们把每一个新元素插入到有序区间的时候,并不需要老老实实进行元素的两两交换,比如在第三轮的时候:

在这里插入图片描述


在第三轮操作中,我们需要让元素3逐个与有序区的元素进行比较和交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。

但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再把有序区的元素从左向右逐一复制。

第一步,暂存元素3:

在这里插入图片描述

第二步,和前一个元素比较,由于3<8,复制元素8到它下一个位置:

在这里插入图片描述


第三步,和前一个元素比较,由于3<6,复制元素6到它下一个位置:

在这里插入图片描述

第四步,和前一个元素比较,由于3<5,复制元素5到它下一个位置:

在这里插入图片描述

第五步,也是最后一步,把暂存的元素3赋值到数组的首位:

在这里插入图片描述

显然,这样的优化方法减少了许多无谓的交换。

3、时间复杂度

小花:这个插入排序算法的时间复杂度是多少呢?
小明:插入排序要进行 n-1 轮,每一轮在最坏情况下的比较复制次数分别为1次、2次、…、一直到 n-1 次,所以最坏时间复杂度为:O(n^2)

4、代码实现

public static void insertSort(int[] arr){
    for (int i = 1; i < arr.length; i++) {
        int insertValue = arr[i];
        int j = i - 1;
        //从右向左比较元素的同时,进行元素复制
        for(; j >=0 && insertValue < arr[j]; j--){
            arr[j+1] = arr[j];
        }
        //insertValue的值插入适当位置
        arr[j+1] = insertValue;
    }
}

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...