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

在这里插入图片描述

👦个人主页: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.rhkb.cn/news/196169.html

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

相关文章

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Stable Diffusion进阶玩法说明

之前章节介绍了Stable Diffusion的入门&#xff0c;介绍了文生图的魅力&#xff0c;可以生成很多漂亮的照片&#xff0c;非常棒 传送门&#xff1a; Stable Diffusion新手村-我们一起完成AI绘画-CSDN博客 那我们今天就进一步讲讲这个Stable Diffusion还能做些什么&#xff0c; …

C语言青蛙爬井(ZZULIOJ1072:青蛙爬井)

题目描述 有一口深度为high米的水井&#xff0c;井底有一只青蛙&#xff0c;它每天白天能够沿井壁向上爬up米&#xff0c;夜里则顺井壁向下滑down米&#xff0c;若青蛙从某个早晨开始向外爬&#xff0c;对于任意指定的high、up和down值&#xff08;均为自然数&#xff09;&…

电脑软件:推荐一款非常实用的固态硬盘优化工具

目录 一、软件简介 二、工作原理 三、功能介绍 3.1、优化SSD设置 3.2、查看驱动器信息 3.3、查看SMART数据 3.4、停用Windows事件日志记录 3.5、禁用Windows碎片整理 3.6、时间戳停用 3.7、禁用引导文件的碎片整理 3.8、关闭短名称 四、使用教程 4.1 安装说明 4.…

滚雪球学Java(09-3):Java中的逻辑运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【算法训练营】参数解析+跳石板

&#x1f308;欢迎来到Python专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mys…

机器学习的逻辑回归

Sigmoid函数 逻辑回归的预测函数 梯度下降法-逻辑回归 import matplotlib.pyplot as plt import numpy as np # 生成一个关于分类器性能的详细报告。 # 这个报告包含了每个类别的精度、召回率、F1分数&#xff0c;以及所有类别的平均精度、召回率和F1分数 from sklearn.metri…

Python爬虫动态ip代理防止被封的方法

目录 前言 一、什么是动态IP代理&#xff1f; 二、如何获取代理IP&#xff1f; 1. 付费代理IP 2. 免费代理IP 3. 自建代理IP池 三、如何使用代理IP爬取数据&#xff1f; 1. 使用requests库设置代理IP 2. 使用urllib库设置代理IP 3. 使用selenium库设置代理IP 四、常…

【AI视野·今日Robot 机器人论文速览 第六十二期】Wed, 25 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 25 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers EquivAct: SIM(3)-Equivariant Visuomotor Policies beyond Rigid Object Manipulation Authors Jingyun Yang, Congyue Deng,…

stable diffusion到底是如何工作的

stable diffusion简单入门 stable diffusion是一个文生图模型&#xff0c;主要由CompVis、Stability AI和LAION的研究者们创建。这个模型主要是在512X512分辨率的图像上训练的&#xff0c;训练数据集是LAION-5B&#xff0c;该数据集是目前可访问的最大的多模态数据集。 在这篇…

LoRa模块空中唤醒功能原理和物联网应用

LoRa模块是一种广泛应用于物联网领域的无线通信模块&#xff0c;支持低功耗、远距离和低成本的无线通信。 其空中唤醒功能是一项重要的应用&#xff0c;可以实现设备的自动唤醒&#xff0c;从而在没有人工干预的情况下实现设备的远程监控和控制。 LoRa模块空中唤醒功能的原理…

Win10关机设置里没有睡眠选项的解决方法

用户想给自己的Win10电脑设置睡眠模式&#xff0c;但是在关机设置里面找不到睡眠选项&#xff0c;导致自己不能顺利完成睡眠模式的设置。接下来小编给大家带来解决Win10关机设置里没有睡眠选项的简单方法&#xff0c;解决后用户就可以看到Win10电脑关机设置中有睡眠选项了。 Wi…

技术分享 | JMeter性能测试实现与分析

导语 JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具&#xff0c;它即能测试动态服务&#xff08;WebService&#xff09;&#xff0c;也能测试静态资源&#xff0c;包括Servlet服务、CGI脚本等&#xff0c;还能测试动态语言服务&#xff08;PHP、Java、ASP…

Flask学习一:概述

搭建项目 安装框架 pip install Flask第一个程序 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "Hello World"if __name__ __main__:app.run()怎么说呢&#xff0c;感觉还不错的样子。 调试模式 if __name__ __main__:a…

调整COSWriter解决X-easypdf / PDFBOX生成大量数据时OOM问题

背景 业务需要生成一个15W数据左右的PDF交易报表。希望我们写在一个文件里&#xff0c;不拆分成多个PDF文件。 使用的技术组件 <dependency><groupId>wiki.xsx</groupId><artifactId>x-easypdf-pdfbox</artifactId><version>2.11.10<…

Swift制作打包framework

新建framework项目 设置生成fat包&#xff0c;包括模拟器x86_64和arm64 Buliding Settings -> Architectures -> Build Active Architecture Only 设置为NO 设置打包环境&#xff0c;选择release edit Scheme -> run -> Build configuration 设置为 Release 设置…

LLM大模型权重量化实战

大型语言模型 (LLM) 以其广泛的计算要求而闻名。 通常&#xff0c;模型的大小是通过将参数数量&#xff08;大小&#xff09;乘以这些值的精度&#xff08;数据类型&#xff09;来计算的。 然而&#xff0c;为了节省内存&#xff0c;可以通过称为量化的过程使用较低精度的数据类…

高级数据结构——树状数组

树状数组&#xff08;Binary Index Tree, BIT&#xff09;&#xff0c;是一种一般用来处理单点修改和区间求和操作类型的题目的数据结构&#xff0c;时间复杂度为O(log n)。 对于普通数组来说&#xff0c;单点修改的时间复杂度是 O(1)&#xff0c;但区间求和的时间复杂度是 O(n…

ssrf学习笔记总结

SSRF概述 ​ 服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL&#xff0c;Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 ​ 如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在“请求伪造”的…

mock测试数据

1.下载一个jar 架包 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1G5rVF5LlIYpyU-_KHsGjOA?pwdab12 提取码&#xff1a;ab12 2.配置当前电脑java环境变量 3.在同一文件目录下创建json 数据4.在终端切换到当前目录下启动服务&#xff0c; java -jar ./moco-r…