排序算法-----插入排序

2023-11-14

目录

前言:

插入排序

 原理图

代码实现

分析总结

二分法插入排序

代码实现


前言:

        嗨嗨^_^,米娜桑,今天我们继续学习排序算法中的插入排序,激不激动,兴不兴奋呢!好了废话不多说,下面请看正文!

插入排序

         插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

 原理图

 初始数组如下所示:

第一次,拿到第一个数字,因为第一个数字不存在顺序,无法进行比较,所以不需要进行相关的操作 第二次,拿到第二个数字 1 ,与前面的数字进行比较,发现6比1大,那么就进行数字交换,如下图所示:

第三次,拿到数字9,发现9,比前面的两个数字都要大,那么就保持位置不变,继续往后看。

 第四次,拿到数字2,此时发现,2比9小,比6小,比1大,那么就把2插入到1和6之间,6和9依次向后移动一位。

第五次,拿到数字4,此时把数字4插入到2和6之间,同样的6和9依次往后移动一位。

第六次,拿到数字8,此时8比9小,那么就插入到9的前面即可,9向后移动一位

第七次,拿到12,发现12比前面已排序好了的数字都要大,那么位置不变。

 第八次,拿到10,此时10比12小,比9大,那么就插入到9和12之间,12向后移动一位。

看,这样就完成了排序了! 

动态图展示 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

//直接插入
void insert_sort(int* n, int length) {
	for (int i = 0; i < length; i++) {
		int temp = n[i];
		for (int j = i - 1; j >= 0; j--) {
			if (n[j] > temp) {
				n[j + 1] = n[j];
				n[j] = temp;
			}
		}
	}
 }
int main() {
	int array[10];
	srand((unsigned)time(0));
	for (int i = 0; i < 10; i++) {
		array[i] = rand() % 20;
	}
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
	printf("\n排序后:");
	insert_sort(array, sizeof(array) / sizeof(int));
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
}
//输出结果:
//9 16 13 4 8 12 2 0 7 2
//排序后:0 2 2 4 7 8 9 12 13 16

分析总结

时间复杂度

最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n );如果完全逆序的话,那么时间复杂度就会变为O(n^2),直接翻倍。所以时间复杂度为O(n^2) 。

空间复杂度

这里没有去开辟空间,空间是一个常量,所以空间复杂度是O(n).

稳定性 

 遇到相同大小元素过程中,依然是插入到相同元素的前边,相对位置没有发生改变,所以稳定性好。

二分法插入排序

 二分法插入排序是对插入排序的代码优化,整体的实质上还是插入排序,时间复杂度依然是不会改变的O(n^2),当n较大时,总排序码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差。同样的,二分法插入排序是稳定的。

 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//二分法插入排序
void insert_bin_sort(int *n,int length) {
	int left, right, mid;
	for (int i = 1; i < length; i++) {
		left = 0;
		right = i - 1;
		while (left <= right) {
			mid = (left + right) / 2;
			if (n[mid] > n[i]) {
				right = mid - 1;
			}
			else
			{
				left = mid + 1;
			}
			
		}
		int temp = n[i];
		for (int j = i; j > left; j--) {
			n[j] = n[j - 1];
		}
		n[left] = temp;
	}
}
int main() {
	int array[10];
	srand((unsigned)time(0));
	for (int i = 0; i < 10; i++) {
		array[i] = rand() % 20;
	}
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
	printf("\n排序后:");
	insert_bin_sort(array, sizeof(array) / sizeof(int));
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
}
//输出结果:
//15 0 15 3 5 7 9 6 12 14
//排序后:0 3 5 6 7 9 12 14 15 15

以上就是今天的全部内容了,我们下一期再见!

分享一张壁纸: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法-----插入排序 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 按成员序列化

    我已经实现了template
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • malloc的实现原理

    在开发c或c 时 经常需要分配内存 如今常用的分配内存函数为malloc tcmalloc jemalloc 其中属于malloc使用最平常 因为属于c标准库函数 但是网上有有实验证明另外两个效率比malloc高 这篇文章主要还是分析mal
  • openWrt 安装管理界面luci中文包

    openWrt15安装管理界面luci中文包 如果刚刷的openwrt15没有中文界面 用ssh连接路由后用opkg安装 root bang bang tang opkg install luci i18n base zh cn Unkno
  • 关于自己对像Chat-GPT的反应速度感悟

    这几个月相信大家应该对ChatGPT都不陌生了吧 因为这个东西已经在各大社交媒体可以说是无限次曝光了 就连一些其他行业的 完全跟科技行业沾不上边的朋友们 都知道了 可想而知 这个是有多火了 而我之所以发表这个感悟 其实也是自己的一个反思吧
  • matlab画矩阵无向网络图,[转]矩阵生成无向网络图

    功能是将邻接矩阵或关联矩阵变为网络图 不过这里只能转换为无向图 有向图的箭头还需要在研究一下 似乎有annotation函数可以调用 函数名netplot 使用方法输入请help netplot 无返回值 函数只能处理无向图 作者 tian
  • 【Java编程】JavaSE基础总结(三):异常机制、泛型

    JavaSE基础总结 三 1 Java异常机制 1 1 异常 在理想的情况下 我们的程序会按照我们的思路去运行 按理说是不会出现问题的 但是 代码实际编写后并不一定是完美的 可能会有我们没有考虑到的情况 如果这些情况能够正常得到一个错误的结
  • 在C++中 ,什么时候用:: ?什么时候用. ?什么时候用->?

    在C 中 什么时候用 什么时候用 什么时候用 gt 在 C 中 和 gt 是三种不同的运算符 用于访问类 结构体 命名空间 指针等的成员 它们的使用场景如下 作用域解析运算符 用于访问命名空间的成员或静态成员 例如 假设有一个命名空间 My
  • 内核中时间相关的知识介绍

    1 内核要解决的时间相关问题 1 如何度量时间差 如何比较时间 2 如何获取当前时间 3 如何将操作延迟指定的一段时间 4 如何调度异步函数到指定的时间之后执行 2 度量时间差 2 1 内核度量时间的原理 1 Soc有时间相关的硬件 比如定
  • tar打包split分割分解拆分大包文件

    2010 01 26 12 47 http hi baidu com hovlj 1130 item fe21d8342e68aa86c3cf2928 tar打包split分割分解拆分大包文件 有时候远程下载tar包的时候 由于包太大 失去
  • 语法分析—自上而下分析

    1 美图 2 位置 语法分析器的功能 语法分析的任务是分析一个文法的句子结构 语法分析器的功能 按照文法的产生式 语言的语法规则 识别输入符号串是否为一个句子 合式程序 语法分析的方法 不行 看不懂 我太难了 不看了
  • Goldengate 12.2新特性-自描述的队列文件

    OGG12 2中最大的变化之一就是队列文件是自描述的 意思是不再担心以前版本中 表结构异构的情况 也不再需要defgen生成定义文件 以及不再使用assumeTargetDefs或SourceDefs参数 许多手工处理的步骤不再需要了 即使
  • 【C/C++】三目运算符的详细分析

    前言 C C 三目运算符是一种条件运算符 也被称为 三元运算符 或 条件运算符 它的语法结构为 condition true expression false expression 表示如果 condition 为真 则执行 true ex
  • 2023华为杯数学建模研赛A题B题C题D题E题F题思路代码成品分享

    2022华为杯将于9 22开赛 思路贴将于早上发布 粉丝可见 国一F奖3年数学建模经验团队 交流裙 735249423 下文是2022年研赛E的思路示例 E题思路 问题1 从机理分析的角度 建立不同放牧策略 放牧方式和放牧强度 对锡林郭勒草
  • .npmrc的作用

    npmrc 文件是用于配置 npm Node js 包管理器 行为的配置文件 通过在项目根目录下创建或编辑 npmrc 文件 你可以自定义 npm 的一些行为和设置 以满足你的项目需求 这个文件通常包含一些键值对 每一对都对应着一个配置项
  • 非中心卡方分布

    非中心卡方分布 非中心卡方分布是卡方分布的一般化形式 如果 是 个独立的正态分布的随机变量均值为 方差为 表示为 那么随机变量 为非中心卡方分布 非中心卡方分布涉及两个参数 表示自由度 即 的数目 是和随机变量 相关的参数 由以上参数所定义
  • spring框架基础篇一 ——Ioc控制反转,DI依赖注入

    因为spring框架设计内容比较多 因此博主分成三篇讲解spring框架 spring基础篇一 Ioc控制反转 DI依赖注入 整合junit spring基础篇二 AOP切面编程 JDBCTemplate spring基础篇三 事务管理 S
  • UiBot无法抓取Google Chrome元素和数据抓取工具无法使用的解决方案

    UiBot RPA抓取 Google Chrome 元素建议使用 Google Chrome 原版浏览器 不建议使用 二次修改的浏览器版本 以确保兼容性最佳 操作流程符合本教程 如果无法抓取 Google Chrome 浏览器元素 或数据抓
  • 校园二手交易小程序

    mysql数据库创建语句 create table t admin id int primary key auto increment comment 主键 username varchar 100 comment 超级管理员账号 pass
  • 从道法术三个层面理解区块链:术

    区块链对当下的大家来说 都还是盲人摸象的阶段 所以经常群里有各种争论 归结起来 都是有的摸到了大腿 有的摸到了耳朵 相互之间就难以说服对方 各自有各自的认知 笔者尝试从道法术这三个层面来解读下区块链 以便让大家有个更全面的了解 也知道自己的
  • Linux设备驱动-procfs

    在Linux中 procfs是进程文件系统 file system 的缩写 包含一个伪文件系统 启动时动态生成的文件系统 可用于内核层和用户层交互信息 这个文件系统通常被挂载到 proc 目录 由于 proc 不是一个真正的文件系统 它也就
  • 排序算法-----插入排序

    目录 前言 插入排序 原理图 代码实现 分析总结 二分法插入排序 代码实现 前言 嗨嗨 米娜桑 今天我们继续学习排序算法中的插入排序 激不激动 兴不兴奋呢 好了废话不多说 下面请看正文 插入排序 插入排序 一般也被称为直接插入排序 对于少量