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

news2024/11/26 18:37:11

在这里插入图片描述

👦个人主页: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.coloradmin.cn/o/1213436.html

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

相关文章

第八章:枚举

系列文章目录 文章目录 系列文章目录前言一、枚举总结 前言 类可以作为常量使用。 一、枚举 枚举是一组常量的集合。可以这里理解&#xff1a; 枚举属于一种特殊的类&#xff0c; 里面只包含一组有限的特定的对象。 枚举的实现方式自定义类实现枚举使用 enum 关键字实现枚举…

MySQL 分库分表与 TiDB(平凯数据库),如何选择?

随着互联网行业的飞速发展&#xff0c;数据量不断增长&#xff0c;传统的关系型数据库已经无法满足大规模数据处理的需求。为了解决这一问题&#xff0c;分库分表和分布式数据库应运而生。本文将对比分析 MySQL 分库分表和 TiDB 这两种解决方案&#xff0c;帮助大家更好地选择适…

自动化测试和手工测试有什么不同以及自动化测试和手工测试应用范围的对比

一、初识自动化测试 如果以前没有做过自动化测试&#xff0c;那么就不了解自动化测试&#xff0c;可能会觉得自动化测试比较神秘&#xff0c;但是&#xff0c;我们在日常的计算机操作中&#xff0c;可能会碰到一些自动化处理的过程&#xff0c;这些过程和自动化测试比较接近。 …

Mysql修改事务隔离级别及与spring隔离级别关系

Mysql如何修改事务隔离级别 1.查询事务级别 1.1查询全局事务隔离级别 select global.tx_isolation; 1.2 查询当前会话事务隔离级别 select session.tx_isolation; 2.修改事务隔离级别 2.1 修改全局事务隔离级别 set global transaction isolation level read committed;…

Kafka 的应用场景

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

景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构TOP20

量子位智库《中国AIGC数据标注产业全景报告》中指出&#xff0c;数据标注处于重新洗牌时期&#xff0c;更高质量、专业化的数据标注成为刚需。未来五年&#xff0c;国内AI基础数据服务将达到百亿规模&#xff0c;年复合增长率在27%左右。 基于数据基础设施建设、大模型/AI技术理…

areca backup备份工具安装与使用

由于FTP数据备份执行&#xff0c;需要人工操作执行&#xff0c;不满足业务需求&#xff0c;发现此工具结合ftp联动可以定时任务进行备份 获取地址 https://nchc.dl.sourceforge.net/project/areca/areca-stable/areca-7.5/areca-7.5-windows-jre64-setup.exe 前提条件 注意…

关闭RecyclerView惯性滚动,以及多个RecyclerView在嵌套滚动中的注意事项

前言&#xff1a; 当前RecyclerView 下拉到顶部 或者 上拉到底部时&#xff0c;虽然滚动列表停止了&#xff0c;但惯性任务并没有结束&#xff0c;一些特殊需求可能受到影响&#xff0c;需要手动停止。 1. RecyclerView源码 调用 rv.stopScroll() 停止&#xff1b; 2. Recycl…

数据库sql语句设置外键

当我们需要在数据库表之间建立关联关系时&#xff0c;可以使用外键&#xff08;Foreign Key&#xff09;来实现。在 SQL 中&#xff0c;外键可以用来保持数据的完整性&#xff0c;并帮助我们更有效地管理数据。以下是设置外键的步骤&#xff1a; 1.在创建表时&#xff0c;需要…

公益SRC实战|SQL注入漏洞攻略

目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站&#xff08;可以查找sql注入漏洞&#xff09; inurl:asp idxx 2.查找网站后台&#xff08;多数有登陆框&#xff0c;可以查找弱口令&#xff0c;暴力破解等漏洞&…

7个免费的优质图标素材网站,设计师必备!

对于交互设计师和产品经理来说&#xff0c;一套漂亮易用的图标可以算是提高效率的法宝&#xff0c;自己导出一套标准化的图标是一个巨大的工程。如何找到一个既美观又实用又能快速重用的图标&#xff1f;别慌&#xff0c;今天我们整理了7个价值高又好用的图标素材网站&#xff…

wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片&#xff0c;记录一下 api&#xff1a;wx.canvasToTempFilePath 效果&#xff1a; 代码&#xff1a;wxml <canvas style"width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id"my…

芯科科技推出新的8位MCU系列产品,扩展其强大的MCU平台

新的BB5系列为简单应用提供更多开发选择 中国&#xff0c;北京 - 2023年11月14日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;&#xff0c;今日宣布…

浅析SVPWM调制技术

目录 收起 目录 目录 一、SVPWM基本原理 1.从三相电机运行原理到SVPWM调制技术 2.SVPWM调制的实现方法 3.合成参考电压矢量的方法 &#xff08;abc->αβ坐标变换&#xff09; 4.基本电压矢量时间的分配 5.基本电压矢量顺序的分配 6.扇区判断 二、仿真验证 1.操…

什么是美颜SDK?美颜SDK对比评测

美颜SDK在视频直播中发挥着越来越重要的作用。为了实现实时、高质量的美颜效果&#xff0c;各种视频直播美颜SDK应运而生。本文将对这些技术进行深入解析与比较。 一、技术原理解析 深度学习技术通过大量的训练数据学习人脸特征&#xff0c;从而实现更为自然的美颜效果。传统…

PowerPoint技巧:如何将一张图片同时加到全部幻灯片里?

想把一张图片加到PPT每一张幻灯片的同一个位置&#xff0c;如果一张一张的添加就太耗时间了&#xff0c;一起来看看如何利用母版快速设置同时添加吧。 首先&#xff0c;打开需要编辑的PPT&#xff0c;在菜单栏依次点击【视图】→【幻灯片母版】&#xff1b; 打开母版后&#x…

2023年【安全员-C证】考试题库及安全员-C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试题库根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证考试总结全…

【App测试】adb三大连接方式-夜神模拟器+真机+android真机(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 adb连接安卓模拟器…

AD教程 (十五)利用IPC封装创建向导快速创建封装

AD教程 &#xff08;十五&#xff09;利用IPC封装创建向导快速创建封装 安装IPC封装向导 点击头像&#xff0c;选择Extensions and Updates&#xff0c;扩展更新确保已经安装了IPC Footprint Generator IPC封装创建向导 打开IPC封装创建向导 进入PCB封装界面&#xff0c;点击…

split loop

// refactoringmotherfucker.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <vector> #include <memory>// before refactoring of split loop class People { public:People(double _age,double _…