数据结构|排序总结(1)|直接插入排序

news2024/11/27 13:46:22

排序分类

插入排序:直接插入排序,希尔排序

选择排序:选择排序,堆排序

交换排序:冒泡排序,快速排序 

归并排序

插入排序

直接插入排序

        相当于摸牌,例如我们现在手上有{2,4,5,6}这些牌,当下一张是3的时候我们要将3插入到2和4当中,那么对于数组我们就要 把4,5,6 都往后挪,给3让出一个位置,这里演示以下往后挪的过程。

现有2,4,5,6

3先和6比,3应该放在6的前面,也就是3和6交换,交换后2,4,5,3,6

3再和5比,3应该放在5的前面,也就是3和5交换,交换后2,4,3,5,6

3再和4比,3应该放在4的前面,也就是3和4交换,交换后2,3,4,5,6

3再和2比,3应该放在2的后面,3本来就在2的后面,那就不用交换了,这就结束了

        很明显,这个要用到循环,既然用到,那么就要有结束条件--------插入的数大于前一个数。

        这个是一个,模拟的过程,但我们一般情况下遇到的都是一个固定长度的数组,也就是说,在不动空间的条件下只是比较交换。

        假设现在是这样的一个数组{ 2,3,1,4,2,5,2,0}我们可以先从第一2位置开始排,接着就是3,1,4...把他们放到该放的位置

先排2,结果如下

第一趟:2,3,1,4,2,5,2,0

在排3,和他前面的2进行比较,不用交换,结果如下:

第二趟:2,3,1,4,2,5,2,0

在排1,和前面的3进行比较,需要交换结果如下:

213,4,2,5,2,0

没有到达循环结束条件(插入的数大于前一个数)所以需要继续和前面的二进行比较,进行交换,结果如下:

1,2,3,4,2,5,2,0,交换后也没有到达循环结束条件,但是1的前面已经没有数了,这样也是结束了1的排序,所以上面的循环结束条件应该在加一个插入的数下标已经为0;因此第三趟排序结果为:

第三趟:1,2,3,4,2,5,2,0

剩下的数依次类推...

#include<iostream>
#include<vector>
using namespace std;
void swap(int& a, int& b)
{
	int tmp=a;
	a = b;
	b = tmp;

}
int main()
{
	vector <int>arr = { 2,3,1,4,2,5,2,0};
	cout << "排序前:";
	for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
	for (int i = 1; i < arr.size(); i++)//i是要排的数
	{
		int t = i;
		for (int j = i - 1; j >=0; j--)//
		{
			if (arr[t] < arr[j])
			{
				swap(arr[t--], arr[j]);
			}
				
			else
				break;
		}
	}
	cout << endl<<"排序后:";
	for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
	return 0;
}

时间复杂度分析

时间复杂度最差的时候:也就是 逆序的时候,下面是他们每次交换后的样子

#include<iostream>
#include<vector>
using namespace std;
void swap(int& a, int& b)
{
	int tmp=a;
	a = b;
	b = tmp;

}
int main()
{
	vector <int>arr = {8,7,6,5,4,3,2,1,0};
	cout << "排序前:";
	for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
	cout << endl<<endl;
	for (int i = 1; i < arr.size(); i++)//i是要排的数
	{
		int t = i;
		for (int j = i - 1; j >=0; j--)//
		{
			if (arr[t] < arr[j])
			{
				swap(arr[t--], arr[j]);
				for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
				cout << endl;
			}
				
			else
				break;
		}
		//cout <<"比较:"<<i<<"次"<<endl;
		cout << endl;

	}
	cout << endl<<"排序后:";
	for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
	return 0;
}

每次交换的次数类似一个等差数列,因此时间复杂度就是O(n^{2})

时间复杂度最好的时候也就是正序的时候,每次交换后如下图所示:

#include<iostream>
#include<vector>
using namespace std;
void swap(int& a, int& b)
{
	int tmp=a;
	a = b;
	b = tmp;

}
int main()
{
	vector <int>arr = {0,1,2,3,4,5,6,7,8};
	cout << "排序前:";
	for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
	cout << endl<<endl;
	for (int i = 1; i < arr.size(); i++)//i是要排的数
	{
		int t = i;
		for (int j = i - 1; j >=0; j--)//
		{
			if (arr[t] < arr[j])
			{
				swap(arr[t--], arr[j]);
				for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
				cout << endl;
			}
				
			else
				break;
		}
		cout <<"比较:"<<i<<"次"<<endl;
		//cout << endl;

	}
	cout << endl<<"排序后:";
	for (int i = 0; i < arr.size(); i++)cout << arr[i] << ' ';
	return 0;
}

可以看出就算本身是有序的,也得过一遍才可以,因此时间复杂度是O(n)

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

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

相关文章

无法解析符号 ‘mybatis‘(类似这种报错)

问题&#xff1a;无法解析符号 mybatis&#xff08;类似这种报错&#xff09; 解决&#xff1a;

安科瑞用户侧35kV用户变电站系统结构【110kV/66kV/35kV】

35kV综自系统项目怎么做&#xff1f;客户群体是什么&#xff1f;能带来多大的业绩&#xff1f; 1&#xff09;主要客户群体是设计院&#xff08;电力设计院、行业设计院&#xff09;、甲方、总包。 2&#xff09;综自系统本身的体量和业绩&#xff1a; a.大约35kV&#xff08…

螺旋矩阵.

0螺旋矩阵 - 蓝桥云课 (lanqiao.cn) 题目描述 对于一个n行m列的表格&#xff0c;我们可以使用螺旋的方式给表格依次填上正整数&#xff0c;我们称填好的表格为一个螺旋矩阵。 例如&#xff0c;一个4行5列的螺旋矩阵如下&#xff1a; 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7 12 …

微服务(狂神)

什么是微服务&#xff1a; 微服务方案&#xff1a; 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题&#xff1a; 1. 服务过多&#xff0c;客户端怎么访问 2. 服务过多&#xff0c;服务间怎么传值 3. 服务过多&#xff0c;如何治理 4. 服务过多…

【HTML】简单制作一个分形动画

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…

Python中csr_matrix的两种初始化方法

本文以csr_matrix为例来说明sparse矩阵的使用方法&#xff0c;其他类型的sparse矩阵可以参考https://docs.scipy.org/doc/scipy/reference/sparse.html csr_matrix是Compressed Sparse Row matrix的缩写组合&#xff0c;下面介绍其两种初始化方法 csr_matrix((data, (row_ind…

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…

Python-VBA函数之旅-bool函数

目录 1、bool函数 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 bool函数(Boolean Function)用于将给定的值转换为布尔值(True或False)。常见的应用场景有&#xff1a; 1、条件判断&#xff1a;bool()…

vulhub之ActiveMQ篇

ActiveMQ的web控制台分三个应用&#xff0c;admin、api和fileserver&#xff0c;其中admin是管理员页面&#xff0c;api是接口&#xff0c;fileserver是储存文件的接口&#xff1b;admin和api都需要登录后才能使用&#xff0c;fileserver无需登录。fileserver是一个RESTful API…

冻干可以天天给成年猫吃吗?5大好口碑不翻车专家直入!

近年来&#xff0c;冻干猫粮因其高品质而备受喜爱&#xff0c;吸引了无数猫主人的目光&#xff0c;像我这样的资深养猫人早已开始选择冻干喂养。新手养猫就弄不明白了&#xff0c;什么是冻干猫粮呢&#xff1f;冻干可以天天给成年猫吃吗&#xff1f; 一、什么是冻干 简单来说&…

【微服务】------微服务架构技术栈

目前微服务早已火遍大江南北&#xff0c;对于开发来说&#xff0c;我们时刻关注着技术的迭代更新&#xff0c;而项目采用什么技术栈选型落地是开发、产品都需要关注的事情&#xff0c;该篇博客主要分享一些目前普遍公司都在用的技术栈&#xff0c;快来分享一下你当前所在用的技…

2024 Flutter iOS 隐私清单上线,5 月 1 号最后期限,你收到 「ITMS-91053」 了吗?

2023 年底的时候&#xff0c;我就发过了 《Flutter 上了 Apple 第三方重大列表&#xff0c;2024 春季 iOS 的隐私清单究竟是什么&#xff1f;》 相关内容&#xff0c;如果你还对隐私清单等相关要求不了解&#xff0c;建议先看看前文。 如果你已经有相关了解&#xff0c;并且近…

【LAMMPS学习】七、加速性能(4)加速器包

7. 加速性能 7.1.基准测试 7.2.测试性能 7.3.通用技巧 7.4.加速器包 LAMMPS 中添加了各种pair_style、fixes、compute 和其他命令的加速版本&#xff0c;其运行速度通常比标准非加速版本更快。有些需要您的系统上存在适当的硬件&#xff0c;例如GPU 或 Intel Xeon Phi 协处…

数据库的负载均衡,高可用实验

一 高可用负载均衡集群数据库实验 1.实验拓扑图 2.实验准备(同一LAN区段)&#xff08;ntp DNS&#xff09; 客户端&#xff1a;IP&#xff1a;192.168.1.5 下载&#xff1a;MariaDB 负载均衡器&#xff1a;IP&#xff1a;192.168.1.1 下载&#xff1a;keepalived ipvsadm I…

适用于 PC-3000 Portable III 的新型 SAS 适配器, 让数据恢复踏足更广!

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复同行&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

开源代码分享(19)-配电网孤岛优化划分方法

参考文献&#xff1a; DING Tao, LIN Yanling, LI Gengfeng, et al. A new model for resilient distribution systems by microgrids formation[J]. IEEE Transactions on Power Systems, 2017, 32(5): 4145-4147. 1.基本原理 通过分布式电源&#xff08;DGs&#xff09;形…

车载平板丨车载数据终端丨车载平板电脑丨农机使用

车载加固终端通常是为了在车辆行驶过程中保证通讯信号稳定和数据传输安全而设计的设备。在农机上使用车载加固终端&#xff0c;可以提高农机在野外作业时的通讯和数据传输质量&#xff0c;增强对农机的控制能力和运行安全性。以下是使用车载加固终端在农机上实现通讯加固的步骤…

Thingsboard PE智慧运维仪表板实例(二)【智慧排口截污实例】

ThingsBoard 的仪表板是一个用于可视化和监控物联网数据的重要组件。 它具有以下特点: 1. 可定制性:用户可以根据自己的需求创建各种类型的图表、表格和指标。 2. 数据可视化:以直观的方式展示设备数据,帮助用户快速了解系统状态。 3. 实时更新:实时反映设备的最新数据…

二叉树的前序遍历、中序遍历、后序遍历

二叉树的前序遍历、中序遍历、后序遍历 一、递归算法的三个要素二、144. 二叉树的前序遍历三、94. 二叉树的中序遍历四、145. 二叉树的后序遍历 一、递归算法的三个要素 1、确定递归函数的参数和返回值&#xff1a; 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在…

报错:AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

报错内容&#xff1a;AttributeError: module PIL.Image has no attribute ANTIALIAS 问题所在&#xff1a; 使用PIL读取图像后对其进行Resize时由于PIL 版本问题出现AttributeError: module PIL.Image has no attribute ANTIALIAS 具体的代码如下 resized_img img.resize(ta…