排序算法之插入排序

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

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

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

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

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

相关推荐
野生技术架构师4 分钟前
我总结了这份2026最新版Java面试题库(背完这一套就够了)
java·开发语言·面试
一只小小的芙厨9 分钟前
KMP总结
算法
可爱の小公举26 分钟前
Java 后端程序员转 AI Agent 工程师:一条可执行学习路线
java·人工智能·学习
bestcxx30 分钟前
多个维度对 Java、Python、C#、Go 这四种主流编程语言进行比较
java·python·c#
Bechamz34 分钟前
大数据开发学习Day26
java·大数据·学习
云深处@35 分钟前
【项目一】高并发内存池
java·开发语言
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第十一篇:双脑协同——WOLM与大模型的共生智能
人工智能·算法·语言模型·架构·创业创新
书源丶1 小时前
三十九、Java 枚举——固定常量的「安全卫士」
java·开发语言
上弦月-编程1 小时前
高效编程利器:转移表技术解析
c语言·开发语言·数据结构·算法·排序算法
薇茗1 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树2
c语言·数据结构·算法·二叉树