排序算法之插入排序

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

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

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

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

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

相关推荐
Z9fish5 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
CodeCaptain5 小时前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
晓13135 小时前
第六章 【C语言篇:结构体&位运算】 结构体、位运算全面解析
c语言·算法
iAkuya5 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展
梵刹古音5 小时前
【C语言】 指针与数据结构操作
c语言·数据结构·算法
VT.馒头6 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
Anastasiozzzz6 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人6 小时前
通过脚本推送Docker镜像
java·docker·容器
铁蛋AI编程实战6 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘7 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频