排序算法之插入排序

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

注意:这里图解有误,是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),非常节省内存。

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

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

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

相关推荐
没有bug.的程序员3 分钟前
金融支付分布式架构实战:从理论到生产级实现
java·分布式·微服务·金融·架构·分布式调度系统
00后程序员张3 分钟前
Jenkins Pipeline post指令详解
java·开发语言
第七序章9 分钟前
【C + +】红黑树:全面剖析与深度学习
c语言·开发语言·数据结构·c++·人工智能
程序员阿达10 分钟前
开题报告之基于SpringBoot框架的路面故障信息上报系统设计与实现
java·spring boot·后端
夜晚中的人海12 分钟前
【C++】滑动窗口算法习题
开发语言·c++·算法
哞哞不熬夜22 分钟前
JavaEE--SpringIoC
java·开发语言·spring boot·spring·java-ee·maven
滑水滑成滑头23 分钟前
**点云处理:发散创新,探索前沿技术**随着科技的飞速发展,点云处理技术在计算机视觉、自动驾驶、虚拟现实等领域的应用愈发广
java·python·科技·计算机视觉·自动驾驶
千里马-horse31 分钟前
fastddsgen.jar 简介
java·jar·fast dds·fastddsgen
TT哇32 分钟前
【Maven】Maven设置国内源
java·maven
violet-lz1 小时前
数据结构四大简单排序算法详解:直接插入排序、选择排序、基数排序和冒泡排序
数据结构·算法·排序算法