“插入排序:小数据量排序的王者“

news2024/10/6 6:44:30

文章目录

  • 🔍什么是插入排序?
  • 🔑插入排序的优缺点
  • 🚀实现插入排序

🔍什么是插入排序?

插入排序是一种简单的排序算法,它的基本思想是:将待排序的元素,从第二个元素开始,依次与前面的已排好序的元素进行比较,将它插入到相应的位置中,直到所有的元素排序完成。在这个过程中,所有比插入元素大的元素都会依次后移一位,留出空间给它插入。

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移.
在这里插入图片描述


🔑插入排序的优缺点

插入排序性能分析

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

插入排序的优点在于简单、易于实现。对于已经有序的数组来说,插入排序只需要进行比较操作而不需要交换操作,因此速度非常快。但是对于无序数组来说,插入排序的时间复杂度会比较高,不太适合大规模的排序。插入排序的时间复杂度是O(n^2),但是在插入小规模数据时,插入排序比较高效。并且,插入排序是一种稳定的排序算法,即排序前后,每个元素的相对位置不会发生变化。所有他是小数据量排序的王者。


🚀实现插入排序

  • 具体实现过程如下:
  1. 从第二个元素开始,将当前元素作为待插入元素,存储在一个临时变量中。
  2. 将待插入元素与已排序的子序列中的元素进行比较,找到待插入位置。
  3. 将插入位置后的元素依次交换,为待插入元素腾出插入位置。

重复步骤 1-3,直到所有元素都插入到了已排序的子序列中,得到最终有序序列。

// 插入排序算法实现
void InsertSort(int* a, int n)
{
    // 循环遍历输入数组,共进行n-1轮插入操作
    for (int i = 0; i < n-1; ++i)
    {
        // 在[0, i]范围内是有序的,取 a[i+1] 的值进行比较并插入
        int end = i;  // end 表示有序区间的最后一个元素下标
        int tmp = a[i+1];  // 记录需要插入的元素值

        // 在有序区间内查找插入位置并移动元素
        while (end >= 0)
        {
            if (a[end] > tmp)  // 将比tmp大的元素向后移动
            {
                a[end + 1] = a[end];
                --end;  // 记录待插入元素应该处于的位置
            }
            else  // 如果找到了合适的插入位置,跳出循环
            {
                break;
            }
        }

        // 将 tmp 插入到待插入位置上
        a[end + 1] = tmp;
    }
}

上述代码的实现过程就是对于第i个元素,将其插入到已排好序的前i-1个元素中,使得前i个元素依旧有序。

  • 插入排序也是其他高级算法的基础,掌握它对于深入学习和研究排序算法是非常有帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里架构师整理的Java经典面试题1220道(附答案)

学习如逆水行舟&#xff0c;尤其是 IT 行业有着日新月异的节奏&#xff0c;我们更要抓紧每一次可以学习和进步的机会。所以&#xff0c;没有撤退可言 即使是面试跳槽&#xff0c;那也是一个学习的过程。只有全面的复习&#xff0c;才能让我们更好的充实自己&#xff0c;武装自…

内网隧道代理技术(五)之 Netcat反弹Shell

Netcat反弹Shell Netcat简称NC,是一个简单、可靠的网络工具,被誉为网络界的瑞士军刀。通NC可以进行端口扫描、反弹Shell、端口监听和文件传输等操作,常用参数如下&#xff1a; 参数作用-c指定连接后要执行的shell命令-e指定连接后要执行的文件名-k配置 Socket一直存活(若不想…

一文了解远程桌面连接

一文了解远程桌面连接 一、引言1.1、远程桌面连接的概述1.2、远程桌面连接的应用场景 二、远程桌面连接的基本原理2.1、远程桌面连接的工作方式2.2、远程桌面连接的安全性 三、远程桌面连接的实现方法3.1、Windows自带的远程桌面连接3.2、第三方远程桌面连接工具 四、远程桌面连…

一阶低通滤波器(CODESYS FC和FB应用介绍)

一阶RC低通滤波器详细算法介绍请参看下面文章链接: PLC信号处理系列之一阶低通(RC)滤波器算法_plc计算滤波频率_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较大的场合这…

数据挖掘——甘肃省县(区)域农业综合实力研究(论文)

《数据挖掘与分析》课程论文 题目&#xff1a;甘肃省县&#xff08;区&#xff09;域农业综合实力研究 xx学院xx专业xx班&#xff1a;xx 2023年6月 甘肃省县&#xff08;区&#xff09;域农业综合实力研究 xx (xx学院 xx学院) 摘要&#xff1a;本文主要研究甘肃省各县&#…

C语言数组指针和指针数组

文章目录 1 数组指针和指针数组的区别2 数组首地址和数组首元素地址的区别参考 1 数组指针和指针数组的区别 对指针数组和数组指针的概念&#xff0c;相信很多C程序员都会混淆。下面通过两个简单的语句来分析一下二者之间的区别&#xff0c;示例代码如下所示&#xff1a; int…

C/C++的发展历程和未来趋势

文章目录 C/C的起源C/C的应用C/C开发的工具C/C未来趋势 C/C的起源 C语言 C语言是一种通用的高级编程语言&#xff0c;由美国计算机科学家Dennis Ritchie在20世纪70年代初期开发出来。起初&#xff0c;C语言是作为操作系统UNIX的开发语言而创建的。C语言的设计目标是提供一种功…

虚拟文件系统的数据结构

文章目录 虚拟文件系统的数据结构超级快挂载描述符文件系统类型索引节点目录项文件的打开实例和打开文件表 虚拟文件系统的数据结构 虽然不同文件系统类型的物理结构不同&#xff0c;但是虚拟文件系统定义了一套统一的数据结构。 &#xff08;1&#xff09;超级块。文件系统的…

【网络2】MII MDC/MDIO

文章目录 1.MII&#xff1a;ISO网络模型中物理层&#xff08;phy&#xff09;和数据链路层&#xff08;mac&#xff09;属于硬件&#xff0c;其余都属于软件kernel2.MDC/MDIO&#xff1a;不仅管phy&#xff0c;只要支持mdio协议都可以管2.1 BMC速率适配&#xff1a;phy和switch…

二层MAC地址介绍

目录 MAC地址介绍 MAC地址的组成 MAC地址分类 MAC地址的作用 二层交换机介绍 MAC地址表的定义 MAC地址表项类型 二层交换机对数据帧的处理动作 MAC地址介绍 MAC地址&#xff08;Media Access Control Address)&#xff0c;直译为媒体存取控制位地址 MAC地址的组成 MA…

【四、基本shell命令】

1 帮助命令 man 获取帮助信息 [root@redis100 a]# man lshelp 获得shell内置命令的帮助信息 [root@redis100 a]# help cd常用快捷键 2 文件目录类 pwd 显示当前工作目录的绝对路径 pwd:print working directory [root@redis100 ~]# pwd /rootls 列出目录的内容 ls: list…

Hyper-V虚拟机安装和使用

目录 什么是虚拟化技术虚拟化技术有以下几个关键概念&#xff1a;虚拟化技术的优点&#xff1a; 什么是Hyper-V虚拟机Hyper-V虚拟机的关键特点和优势&#xff1a;使用Hyper-V虚拟机我们能做什么 安装Hyper-V系统要求启用Hyper-V功能创建虚拟机安装操作系统 最近在研究人工智能A…

仙境传说RO:NPC对话| mes/next/close函数用法详解

仙境传说RO:NPC对话| mes/next/close函数用法详解 大家好&#xff0c;我是艾西&#xff0c;今天跟大家讲解下仙境传说mes/next/close函数&#xff0c;在游戏中所有的NPC对话都是用mes函数来创建的。 我们先打开官方文档的script _commands.txt文件&#xff0c;搜索*mes searc…

mmdetection调用模型训练

mmdetection调用模型训练 文章目录 mmdetection调用模型训练转化数据集格式从labelme到coco首先data导进来改一下coco.py改一下class_names.py在模型跑了之后看生成文件然后掐了包版本设置PYTHONPATHdiffustiondet模型模型训练跑完了检测模型 yolo模型yolof模型 转化数据集格式…

qemu arm-trusted-firmware atf 的编译

参考网站 ATF (arm-trusted-firmware&#xff09;&#xff0c;可以称之为 Trusted Firmware-A (TF-A)&#xff0c;也就是 TF-A https://www.trustedfirmware.org/ https://github.com/ARM-software/arm-trusted-firmware 环境 使用 qemu&#xff0c;就是不需要板子 win10 …

Node.js入门与 Webpack模块打包工具

目录 Node.js入门 fs模块-读写文件 path模块-路径处理 压缩前端html 认识URL中的端口号 http模块-创建Web服务 体验 Web 服务除了接口数据以外&#xff0c;还能返回网页资源等 Node.js模块化 ECMAScript标准-默认导出和导入 ECMAScript标准-命名导出和导入 包的…

攻防世界-Reverse-Game

题目描述&#xff1a;下载附件&#xff0c;得到一个exe程序&#xff0c;运行该程序&#xff0c;可以看到如下的界面 根据描述信息说明&#xff1a; a. 这是一个电路&#xff0c;有8个开关&#xff0c;只有8个开关全部闭合&#xff0c;才能够获取到flag&#xff1b; b. 其中n表…

Unity shader - 纹理采样

目录 1.什么是UV 2.凹凸纹理 3.渐变纹理映射 4.遮罩纹理 1.什么是UV 对于三维模型&#xff0c;有两个最重要的坐标系统&#xff0c;一是顶点的位置&#xff08;X&#xff0c;Y&#xff0c;Z&#xff09;坐标&#xff0c;另一个就是UV坐标。什么是UV&#xff1f;简单的…

关于机器人精度的总结(重复精度和绝对精度区分)

ABB系列某款机器人精度参数表 机械臂是工业生产中的重要设备,在焊接码垛 以及 非 接触测量等 领域中有 着重要应 用。然而由于机械臂本体制造中存在机械制造公差装配误差导致的运动学参数误差以及电机转角与关节转角间减速比误差等,导致机械臂存在重复性定位精度较高(0.05 mm …

EMQ的介绍及整合SpringBoot的使用

首先先了解一下底层的协议: 1. MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅 &#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建…