排序算法之插入排序

插入排序是一种基于有序的排序,打个比方,我们在玩扑克牌的时候,每一次摸牌的时候就直接把牌插入到对应的位置,而不需要将其他牌再牌序,这就是插入排序,数字越有序,速度越快,所以我们经常把插入排序用于其他排序的优化

注意:这里图解有误,是tmp的值比 j 的值小,把j的值放在 j+1 的位置上,我这里写错了

这里简单解释一下上图,首先我们定义一个i下标为数组的第二个元素,j 下标为 i下标的前一个元素,j 每次减减,然后和tmp比较

那么如何正确的写一个插入排序呢?请看下面代码

java 复制代码
public static void insertsotr(int[] array){
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= 0 ; j--) {
                if(array[j]>tmp){
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }
  • 时间复杂度:

    • 最坏情况(O(N^2)): 当输入数组完全逆序时,每次插入操作几乎都需要移动已排序序列中的所有元素。因此,总的比较和移动次数接近于n(n-1)/2,即O(N^2)。
    • 最好情况(O(N)): 当输入数组已经是排序状态时,插入排序只需进行n-1次比较(无需移动),因此时间复杂度为O(N)。
    • 平均情况(O(N^2)): 对于随机排列的数据,插入排序的平均时间复杂度也是O(N^2)。
  • 空间复杂度(O(1)): 插入排序是一种原地排序算法,除了输入数组外,仅需常数级别的额外空间(用于交换和临时变量),因此其空间复杂度为O(1),非常节省内存。

  • 稳定性:插入排序是稳定的排序算法。这意味着相等的元素在排序前后相对顺序不变。这是因为插入排序是通过在已排序序列中找到合适的位置插入元素,而不是像选择排序那样交换位置。

  • 适用场景:插入排序特别适合于小规模数据集或接近于有序的数据集。对于近乎有序的数据,插入排序的性能非常好,因为它可以减少元素的移动次数。此外,由于其简单和原地排序的特性,它也常被用作更复杂排序算法(如快速排序)中的基础排序步骤,尤其是在分治策略中处理小数组时。

总的来说,插入排序因其简单、稳定和空间效率高的特点,在特定场景下是非常实用的排序算法。

相关推荐
nanxun8863 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103516 小时前
Day01 | Java 基础(Java SE)
java
行者全栈架构师7 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师12 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_012 小时前
mac(m5)平台编译openjdk
java
JieE21221 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端