【数据结构】直接插入排序

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:数据结构
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵
希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


一、基本思想

在这里插入图片描述

基本思想:把待排序的元素从小到(从大到小)逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

实际中,玩扑克牌时,整理一副牌从小到大或者从大到小就用到了插入排序的思想

在这里插入图片描述

二、算法原理

  1. 首先序列中的第一个元素(下标为0)是不需要排序的。因为当插入第一个元素时,序列中也没有元素与其比较,因此默认为有序。
  2. 当插入第ii ≥ 1)个元素时,由于要挪动数据,我们拿待插入元素当前数组内的最后一个元素(下标end)进行比较,若a[i] < 数组最后一个元素,则将当前元素向后移动一个单位,并将end--继续向前比较,直到找到合适位置为止。

这里为大家举几个样例

  • 插入1

在这里插入图片描述

  • 插入3

在这里插入图片描述

  • 插入5

在这里插入图片描述

三、代码实现

以下代码以升序为例:

#include <stdio.h>// n - 元素个数
void InsertSort(int* a, int n)
{// 数组第一个元素不需要参与排序// 下标从1开始for (int i = 1; i < n; i++){// end - 每一次数组最后一个元素的下标// InsertNum - 要插入的元素int end = i - 1; int InsertNum = a[i];while (end >= 0){// 如果插入的元素比当前元素小,就要往后挪动数据if (a[end] > InsertNum){a[end + 1] = a[end];end--;}// 插入比当前元素大,则直接插入else{a[end + 1] = InsertNum;break;}}//当循环结束后,可能存在头插if (end == -1){a[end + 1] = InsertNum;}}
}

当然以上代码在插入过程中有重复代码,因此可以整合

#include <stdio.h>// n - 元素个数
void InsertSort(int* a, int n)
{// 数组第一个元素不需要参与排序// 下标从1开始for (int i = 1; i < n; i++){// end - 每一次数组最后一个元素的下标// InsertNum - 要插入的元素int end = i - 1; int InsertNum = a[i];while (end >= 0){// 如果插入的元素比当前元素小,就要往后挪动数据if (a[end] > InsertNum){a[end + 1] = a[end];end--;}// 插入比当前元素大,则直接插入else{break;}}// 当循环结束后,存在两种情况// 1. 头插// 2. break跳出来的 // 以上情况直接插入即可a[end + 1] = InsertNum;	}
}

【运行结果】

在这里插入图片描述

四、特性总结

  1. 时间复杂度

最好情况:原数组已经是按需求有序了,每趟只需与前面的有序元素序列的最后一个元素进行比较,总比较次数为n - 1,时间复杂度为 O(N);

最坏情况:假设要排升序,原数组是逆序的情况下,O(N2)

综上,直接插入排序的时间复杂度为O(N2)

  1. 空间复杂度

O(1)。只用到了一个数组

  1. 稳定性

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。如果碰见一个和插入元素相等的,那么将会把待插入元素放在相等元素的后面。所以,相等元素的相对的前后顺序没有改变,所以插入排序是 稳定 的。

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

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

相关文章

纳米软件分享:电源芯片测试指标与测试注意事项

电源芯片测试旨在检测电源管理芯片的质量和性能&#xff0c;保证其可以长期稳定工作。电源芯片测试的参数主要有输入/输出电压、输出电流、效率、温度、功耗等。本文将对电源芯片测试参数以及测试注意事项进行介绍。 电源管理芯片的测试参数 1. 输入电压范围 指电源芯片正常工作…

【论文精读2】R-MVSNet

R-MVSNet【递归多视图立体网络】&#xff0c;论文全名&#xff1a;“Recurrent MVSNet for High-resolution Multi-view Stereo Depth Inference”&#xff0c;CVPR 2019(CCF A) 在MVSNet的基础上做了一些改进&#xff0c;主要解决的问题是代价体正则化&#xff08;Cost Volume…

mysql之搭建MHA架构实现高可用

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换&#xff08;基于主从复制才能故障切换&#xff09; MHA最少要求一主两从&#xff0c;半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30…

入站一个月涨粉80万!B站竖屏UP主如何突出重围?

B站仍然秉持着“内容为王”的社区氛围&#xff0c;这也是众多UP主们一同坚持的事。不管是今年宣布的Story Mode竖屏模式开放还是14周年庆上B站董事长兼CEO陈睿宣布作品播放量改播放分钟数等等改动来看&#xff0c;都能感受到B站在向更多优质创作者招手&#xff0c;并维护着优质…

第四代管网水位监测仪:管网水位监测仪使用方法

排水管网水位监测是城市管理的重要环节之一&#xff0c;城市管理部门一直都想要确保排水管网的正常运行&#xff0c;以此促进城市的发展和智慧城市的建设。想要依靠人工对城市排水管网设施进行检修是一个大工程&#xff0c;不仅要耗费大量的人工和时间成本&#xff0c;还有可能…

SCons

什么是构建工具&#xff08;系统&#xff09; 构建工具&#xff08;software construction tool&#xff09;是一种软件&#xff0c;它可以**根据一定的规则或指令&#xff0c;将源代码编译成可执行的二进制程序。**这是构建工具最基本也最重要的功能。 实际上构建工具的功能…

Kafka 的应用场景

Kafka 是一个开源的分布式流式平台&#xff0c;它可以处理大量的实时数据&#xff0c;并提供高吞吐量&#xff0c;低延迟&#xff0c;高可靠性和高可扩展性。 Kafka 最初是为分布式系统中海量日志处理而设计的。它可以通过持久化功能将消息保存到磁盘&#xff0c;并让消费者按…

移远EC600U-CN开发板 11.15

制作一个简单UI: 1."端口设置"模块 *效果图 *代码 def backEvent(evt): #返回主界面code evt.get_code() if code lv.EVENT.CLICKED:lv.scr_load(mainInterface)def popUpEvent(evt): #弹窗提醒code evt.get_code()if code lv.EVENT.CL…

JavaScript数据存储

原始类型&#xff1a;存储在栈内存中&#xff0c;每次开辟的空间大小是固定 引用类型&#xff08;对象、函数、数组&#xff09;&#xff1a;存储在堆内存中&#xff0c;开辟的空间大小根据数据的大小决定 // 声明变量会在栈内存中开辟空间 // 创建对象在堆内存中开辟空间&…

Django——模板层、模型层

模板层 一. 模版语法 {{ }}: 变量相关 {% %}: 逻辑相关 1. 注释是代码的母亲 {# ... #} 2. 基本数据类型传值 int1 123 float1 11.11 str1 我也想奔现 bool1 True list1 [小红, 姗姗, 花花, 茹茹] tuple1 (111, 222, 333, 444) dict1 {username: jason, age: 18, i…

ERP和MES对接都有什么方式

万界星空科技MES生产管理系统的应用比较广&#xff0c;在和ERP连接时&#xff0c;必须先掌握什么模块是和MES业务流程有关的。 通过详细介绍ERP和MES对接方式的不同特点、应用场景和操作方法&#xff0c;可帮助企业更好地实现信息集成&#xff0c;提升生产效率和质量&#xff…

Donut 中,video组件层级失效、同层渲染失效、z-index设置无效解决办法

微信小程序转安卓之后&#xff0c;z-index设置的层级关系失效&#xff0c;video组件总是处在最上层解决办法&#xff1a; 很重要的设置! 同层渲染要开 xweb&#xff0c;project.miniapp.json中勾选此设置 感谢腾讯官方大佬 黄嘉敏