排序算法入门:直接插入排序详解

这里写目录标题

介绍

直接插入排序是一种简单直观的排序算法,适用于小规模数据或基本有序的数据集。其核心思想是构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

原理

我们以下面这组数据为例

在开始排序前我们先了解直接插入排序的精髓

我们在打扑克时,习惯将手牌排成有序状态。当我要为J排序时,我习惯把J拿出来,此时J的位置相当于空出来了,如果J的前面是K,那我把J插入到K的前面。这个过程相当于让K后移到J起初的位置,再把J插入到空缺位置。

所以,直接插入排序的精髓在我看来就是腾出一个空位置

有了这个认识我们现在来尝试给数据排序:

--我定义出 i指针 和 j指针,i指针向后移动,j指针始终在 i指针的前一个位置

--利用"空位置"思想,把44取出,由变量tmp保存其数值。此时就相当于出现一个空位

--比较 j 和 j+1(其实就是i),如果 j>j+1,就将 j挪到 j+1的位置。随后数据会被分为有序区和无序区

--上面那个例子不能体现移动的过程,来看下面这个

tmp < 44,此时应该让44后移

44移动后,"空缺"相当于出现在原本是44的位置。在移动的过程中,我们不去改变 i的值,所有控制都通过 j实现,j需要跟着往前移动,直到 j走出数组。

--我们再来看一次移动,后续逻辑都是相似的

我们插入5时,排序的过程如下图所示

--总结这个过程:
将待排序数据分为已排序和未排序两部分。初始时已排序部分仅包含第一个元素,未排序部分包含剩余元素。从未排序部分取出第一个元素,与已排序部分的元素从后向前依次比较,找到合适的位置插入。

代码实现

cpp 复制代码
void insertionSort(int arr[], int n)
{
    if (n <= 1) return; // 处理空数组或只有一个元素的情况
    
    int i, j;
    for (i = 1; i < n; i++)
    {
        if (arr[i] < arr[i - 1])
        {
            int tmp = arr[i];
            for (j = i - 1; j >= 0 && tmp < arr[j]; j--)
            {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = tmp;
        }
    }
}

分析

最好情况:数组已经是有序的,时间复杂度为O(N),仅需遍历一次

最坏情况:数组完全逆序,时间复杂度O(N^2),i和j都要遍历

相关推荐
有为少年4 分钟前
Welford算法 | 从单一到批次
大数据·人工智能·深度学习·神经网络·算法·机器学习
吴可可1237 分钟前
Teigha处理CAD样条曲线的方法解析
数据库·算法·c#
啊董dong19 分钟前
noi-2026年5月12号小测验
数据结构·c++·算法
不知名的忻20 分钟前
红黑树(简易版)
算法·红黑树
NQBJT22 分钟前
万字拆解 NeckFix:AI 脖子前倾检测的算法原理与工程实现
人工智能·算法
jaychouchannel27 分钟前
Python 常用排序算法详解
算法
数智工坊28 分钟前
【Inner Monologue论文阅读】: 首次将大语言模型嵌入机器人控制闭环,实现自我反思和动态行为调整
论文阅读·人工智能·算法·语言模型·机器人·无人机
振浩微433射频芯片38 分钟前
告别“喊破嗓”:深度解析433MHz射频在宠物训练器中的核心应用与选型
单片机·嵌入式硬件·物联网·学习·宠物
知识分享小能手1 小时前
Flask入门学习教程,从入门到精通, Flask模板 — 完整知识点与案例代码 (2)
python·学习·flask
为何创造硅基生物1 小时前
C 语言 typedef 结构体私有化
c语言·开发语言·算法