排序算法 —— 直接插入排序

目录

1.直接插入排序的思想

2.直接插入排序的实现

实现分析

实现代码 

3.直接插入排序的分析

时间复杂度分析

空间复杂度分析 

稳定性


1.直接插入排序的思想

直接插入排序的思想就是把待排序的元素按其关键码值的大小依次插入到一个已经排好序的有序序列中,直到所有的元素插入完为止,得到一个新的有序序列。

在我们日常生活中,玩扑克牌时,其实就是运用了直接插入排序的思想。

2.直接插入排序的实现

实现分析

当只有一个元素的时候,这一个元素肯定是有序的,所以,从第二个元素开始,直到后面的所有元素都是待排序的元素。

因此,我们只需要从左到右依次枚举待排序的元素,将待排序的元素插入到有序序列中即可。

比如:当我们要排升序的时候,枚举到4的时候,4就是待排序元素,4大于它的前一个元素,说明4所在位置值正确的,不需要做其他操作。当我们枚举到2的时候,2就是待排序的元素,对于这种情况,下面的图中,很详细的讲解了这种情况下如何实现一个元素的插入逻辑。

 需要注意的是:

  • 枚举待排序元素的时候是从左到右枚举,并且是从第二个元素开始枚举,直到最后一个元素。(因为第一个元素本来就是有序的)
  •  寻找插入位置是从右往左开始寻找的,最后插入的时候,是赋值给end+1的位置。(因为,我们每次都去和end位置的值作比较,当end位置的值小于tmp中保存的值的时候,end+1就是要插入的值)

实现代码 

#include <stdio.h>void InsertSort(int* nums, int n)
{// [0,end]有序,把end+1位置的插入到前序序列// 控制[0,end+1]有序int i = 0;for (i = 1; i < n; i++)      // 枚举待排序的元素 {int tmp = nums[i];       // 保存待排序的值// 依次和前一个位置比较,寻找插入位置 int end = i-1;while (end >= 0)         {if (tmp < nums[end]) // 当tmp小于end位置的值的时候,需要继续寻找插入位置 {nums[end + 1] = nums[end];--end;}else                 // 当tmp大于or等于end位置的值的时候,说明找到了插入位置 {break;}}// 将tmp中保存的值插入到正确的位置 nums[end + 1] = tmp;}
}int main()
{int nums[] = { 3,4,2,1,7,8,5,6 };InsertSort(nums, 8);int i = 0;while(i < sizeof(nums)/sizeof(int)){printf("%d ",nums[i]);i++;}return 0;
}

代码运行结果如下:

 

3.直接插入排序的分析

时间复杂度分析

假如在最坏情况下:

我们需要枚举n-1个元素,从左到右依次需要比较1、2、3 …… n-1次,这不就是妥妥的等差数列吗?根据等差数列公式并结合大O表示法,最后的时间复杂度为O(N^2)

空间复杂度分析 

在整个排序中的实现中,我们并没有开辟其他的空间,只是使用了常数个的空间,所以空间复杂度是O(1)。

稳定性

在排序的过程中,由于我们是从右往左依次比较,当出现两个相同的元素的时候,后面的元素不会插入到前面那个相同元素的前面。只会插入在相同元素的后面,元素的相对顺序位置不会变,所以直接插入排序是稳定的。

比如:i位置的2并没有小于end位置的2,直接就跳出循环了,元素的相对顺序位置不变。

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

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

相关文章

YOLOv11改进策略【卷积层】| SAConv 可切换的空洞卷积 二次创新C3k2

一、本文介绍 本文记录的是利用SAConv优化YOLOv11的目标检测网络模型。空洞卷积是一种在不增加参数量和计算量的情况下,通过在卷积核元素之间插入空洞来扩大滤波器视野的技术。并且为了使模型能够适应不同尺度的目标,本文利用SAConv将不同空洞率卷积结果进行结合,来获取更全…

pycharm调试带参数命令行的程序

点击 run configuration 点击加号&#xff0c;选择python name填写程序名字&#xff0c;script填写程序路径&#xff0c;下一行填写传入的参数 点击apply&#xff0c;再点ok&#xff0c;即可debug 参考&#xff1a; pycharm 调试模式下命令行参数的传递_pycharm debug传参 ya…

项目实战:构建 effet.js 人脸识别交互系统的实战之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀构建 effet.js &#x1f4d2;1. 什么是effet.js&#x1f4dc;2. 为什么需要使用effet.js&#x1f4dd;3. effet.js的功能&#x1f4da;4. 使用…

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…

bash之流程控制

一.if else 和 Java、PHP 等语言不一样&#xff0c;sh 的流程控制不可为空 在 sh/bash 里可不能这么写&#xff0c;如果 else 分支没有语句执行&#xff0c;就不要写这个 else。 if 语句语法格式&#xff1a; if condition thencommand1command2...command…

HTML之表单设计

1、HTML表单 HTML表单是用于收集用户输入的信息&#xff0c;并将用户输入的内容信息传到后台服务器中。 表单是通过form标签实现。 特别注意&#xff1a;如果一些内容提交后&#xff0c;没有将内容提交给后台服务器&#xff0c;那么需要添加一个name属性&#xff0c;语法&am…

【27续】c++项目练习

定义一个或多个类&#xff0c;来描述以下需求&#xff1a; 汽车&#xff0c;有多个轮胎&#xff0c;一个发动机&#xff0c;品牌&#xff0c;型号, 价格&#xff0c; 行驶里程。 轮胎&#xff0c;有品牌&#xff0c;尺寸&#xff0c;气压。 发动机&#xff0c;有品牌&#x…

NC 单据模板自定义项 设置参照(自定义参照)

NC 单据模板自定义项 设置参照&#xff08;自定义参照&#xff09; 如图下图&#xff0c;NC 单据模板自定义项 设置参照&#xff1a; 1、选择需要设置参照的自定义字段&#xff0c;选择高级属性页签&#xff0c;在类型设置中&#xff0c;数据类型选择参照信息&#xff0c;即bd…

Debian12离线部署docker详细教程

1、转至 https://download.docker.com/linux/debian/dists/ 2、在列表中选择您的 Debian 版本。 cat /etc/os-release # 我的版本号是bookworm3、转到pool/stable/并选择适用的架构&#xff08;amd64、 armhf、arm64或s390x&#xff09; 4、在deb网址下&#xff0c;下载Doc…

【热门主题】000004 案例 Vue.js组件开发

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

JavaWeb合集11-Maven高级

十一、Maven高级 1、分模块设计与开发 为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用&#xff0c;资源共享。 分模块开发需要先针对模块功能进行设计&#xff0c;再进行编码。不会先将工程开发完毕,然后进行拆分。 实现步骤&…

RabbitMQ下载与配置

安装Erlang Erlang 下载地址如下&#xff1a; https://erlang.org/download/otp_versions_tree.html 安装 RabbitMQ RabbitMQ 下载地址如下&#xff1a; https://www.rabbitmq.com/install-windows.html 查看服务&#xff0c;服务已经正常启动 打开Command Prompt 输入rabb…

Go语言中的错误处理:使用自定义错误类型和panic/recover机制

package mainimport ("fmt" )// 定义一个 DivideError 结构&#xff0c;用于表示除法错误 type DivideError struct {dividee int // 被除数divider int // 除数 }// 实现 error 接口 // 这个方法返回一个描述错误的字符串 func (de *DivideError) Error() string {s…

bash之基本运算符

一.算术运算符 vim test.sh #!/bin/basha10 b20valexpr $a $b echo "a b : $val"valexpr $a - $b echo "a - b : $val"valexpr $a \* $b echo "a * b : $val"valexpr $b / $a echo "b / a : $val"valexpr $b % $a echo "b % a …

TH-OCR:强大的光学字符识别工具与车牌识别应用

在当今数字化的时代&#xff0c;高效准确地识别文本和图像中的字符变得至关重要。TH-OCR&#xff08;清华 OCR&#xff09;作为一款优秀的光学字符识别软件&#xff0c;以其卓越的性能和广泛的应用场景&#xff0c;受到了众多用户的青睐。其中&#xff0c;车牌识别功能更是在交…

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-11

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问&#xff08;Batch Key Access, BKA&#xff09; 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术&#xff0c;特别是在通过索引进行 JOIN 时&#xff0c;它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…

HTML和CSS:构建现代网页的基础

HTML和CSS:构建现代网页的基础 HTML(HyperText Markup Language)和CSS(Cascading Style Sheets)是构建和设计网页的两种核心技术。HTML负责网页的结构和内容,而CSS则负责网页的样式和布局。了解这两种技术对于网页设计和开发至关重要。 HTML基础 HTML是一种标记语言,…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…