[ 数据结构 -- 手撕排序算法第一篇 ] 插入排序

news2024/11/18 8:10:59

文章目录

  • 前言
  • 一、常见的排序算法
  • 二、插入排序的实现
    • 2.1 基本思想
    • 2.2 直接插入排序
      • 2.2.1 单趟排序的代码实现
  • 三、插入排序代码实现
  • 四、插入排序测试
  • 五、插入排序的时间复杂度
    • 5.1 最坏的情况下
    • 5.2 最好的情况下
  • 六、直接插入排序特性总结
  • 总结


前言

手撕排序算法第一篇:插入排序!
从本篇文章开始,我会介绍并分析常见的几种排序,例如像插入排序,冒泡排序,希尔排序,选择排序,快速排序,堆排序,归并排序等等!
这篇文章我先来给大家手撕一下插入排序

大家可以点下面的链接去阅读其他的排序算法:
C语言手撕排序算法


正文开始!

一、常见的排序算法

在这里插入图片描述

二、插入排序的实现

2.1 基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完成为止,得到一个新的有序序列。

实际中我们玩扑克牌时,就用了插入排序的思想

在这里插入图片描述

2.2 直接插入排序

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好了序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入为止即将array[i]插入,原来位置上的元素顺序向后移动。

在这里插入图片描述

2.2.1 单趟排序的代码实现

//单趟[0,end]有序,end+1位置的值插入进去,保持它依旧有序。
	//[0,end] end +1
	int end;
	int tmp = a[end + 1];
	while (end >= 0)
	{
		if (a[end] > tmp)
		{
			a[end + 1] = a[end];
			end--;
		}
		else
		{
			break;
		}
	}
	a[end + 1] = tmp;

三、插入排序代码实现

在单趟排序的基础之上,我们写一个大循环即可解决整个数组。

void InsertSort(int* a,int n)
{
	for (int i=0;i<n-1;i++)
	{
		//[0,end] end +1
		int end=i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

四、插入排序测试

void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
}
void InsertSort(int* a,int n)
{
	for (int i=0;i<n-1;i++)
	{
		//[0,end] end +1
		int end=i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}
void TestInsertSort()
{
	int a[] = {6,3,1,4,2,5};
	printf("排序前:");
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	InsertSort(a,sizeof(a)/sizeof(a[0]));
	printf("排序后:");
	PrintArray(a, sizeof(a) / sizeof(a[0]));
}

int main()
{
	TestInsertSort();

	return 0;
}

在这里插入图片描述

五、插入排序的时间复杂度

5.1 最坏的情况下

最坏的情况就是逆序排顺序然后进行头插,每次交换的次数为1+2+3+…+n;
所以时间复杂度是O(n^2)

5.2 最好的情况下

最好的情况就是本来有序的数组进行排序,每次插入都是在尾部,比较的次数为n;
所以时间复杂度是O(n)

六、直接插入排序特性总结

直接插入排序的特性总结:
1.元素越接近有序,直接插入排序算法是一种效率比较高的排序算法
2.时间复杂度为:O(n^2)
3.空间复杂度为:O(1),它是一种稳定的排序算法。


总结

(本篇完!)
下一篇我来给大家讲解关于希尔排序,希尔排序是基于插入排序的一种延展。

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

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

相关文章

HashSet源码解析

HashSet源码解析 问题 &#xff08;1&#xff09;集合&#xff08;Collection&#xff09;和集合&#xff08;Set&#xff09;有什么区别&#xff1f; &#xff08;2&#xff09;HashSet 怎么保证添加元素不重复&#xff1f; &#xff08;3&#xff09;HashSet 是否允许 nu…

基于nodejs大学生宿舍管理系统的设计与实现.zip(论文+源码+ppt文档+视频录制)

相关资料下载地址&#xff1a;请点击下载》》》 1 绪论 3 1.1 项目开发背景和意义 3 1.2 项目研究现状 3 1.3 项目主要的内容 4 2 相关技术介绍及环境开发条件 4 2.1相关技术介绍 4 2.1.1 nodejs开发框架 4 2.1.2 MySQL数据库 5 2.1.3VSCODE开发工具 6 2.2环境开发条件 6 3 系…

C51——震动控制喇叭

通过继电器使得喇叭稍微的带一点点智能的感觉&#xff1a; 当振动传感器模块 感受到震动的时候让喇叭响起来&#xff0c;这喇叭之后两根线来供电&#xff0c;这便少不了继电器的作用 震动模块&#xff0c;继电器和单片机的连接方式在前面已经提到了 这里我们先让电源的负极和…

就是收藏,不解释。Jmeter接口测试数据库断言的实现与设计

接口测试大部分都使用接口的响应值作为接口验证的依据&#xff0c;但在与数据库有交互的接口中这种结果判断不足以判断接口的正确性&#xff0c;本文将以jmeter作为接口测试的工具来实现接口的数据库断言 一、总体思路概述 使用jmeter发起接口请求使用json提取器获取接口响应结…

双指针算法(尺取法)

目录 一 算法简介 1&#xff09;算法解释 2&#xff09;概述 3&#xff09;分类 4&#xff09;前提 5&#xff09;算法模板 6&#xff09;常见问题 二 算法实践 1&#xff09;反向扫描 1&#xff09;反转字符串&#xff08;一&#xff09; 题目描述 思路 解法 2&…

fiddler抓包 - Android 虚拟机

导出fiddler 证书 将Fiddler的证书导出到电脑&#xff0c;点击Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop 下载和安装openssl 添加一下path :C:\Program Files\OpenSSL-Win64\bin 证书格式转换与重命名 1、将Fiddler cer证书转…

CS61A Proj 3

更好的阅读体验 Project 3: Ants Vs. SomeBees ants.zip The bees are coming! Create a better soldier With inherit-ants. Introduction Important submission note: For full credit, Submit with Phase 1 complete by Thursday, March 3 (worth 1 pt).Submit with Phase …

【Flink】Flink 1.13 版本 KafkaSource 代码解读

文章目录 1.概述2. 案例3.源码解读3.1 build3.2 handleOperatorEvent3.3 addSplits3.4 createSplitFetcher3.5 创建SplitFetcher2.6 运行2.7 启动 SplitFetcher2.8 runOnce2.9 fetchTask.run2.9 fetch1.概述 因为最近看到新版本的kafka source进行改版了,于是就想测试一下看看…

Gradle学习笔记之任务

文章目录任务入门任务行为任务的依赖方式参数依赖内部依赖外部依赖多种依赖方式的混合跨项目依赖任务执行gradle run命令演示gradle projects演示gradle tasks演示gradle tasks --all演示查看指定的任务组任务查看某一任务的详细信息查看项目的依赖关系查看项目的属性信息任务类…

RCNN网络源码解读(Ⅱ) --- 使用IOU计算正负样本用于finetune训练

目录 1.预训练二分类器Alexnet 1.1 code&#xff08;finetune.py&#xff09; 2.二分类数据集处理 2.1 code&#xff08;cerate_classifier_data.py&#xff09; 1.预训练二分类器Alexnet 1.1 code&#xff08;finetune.py&#xff09; 1.引入头文件 import os import c…

阿里是如何使用分布式架构的,阿里内部学习手册分享

为什么要使用分布式架构&#xff1f;分布式架构解决了互联网应用的两大难题&#xff1a;高并发和高可用。高并发指服务器并发处理客户端请求的数量大&#xff0c;而高可用指后端服务能始终处于可用状态。 提高系统容量 随着业务越来越复杂&#xff0c;服务也会变得越来越复杂…

CS61A Proj 2

更好的阅读体验 Project 2: CS 61A Autocorrected Typing Software cats.zip Programmers dream of Abstraction, recursion, and Typing really fast. Introduction Important submission note: For full credit: Submit with Phase 1 complete by Thursday, February 17, wo…

ADI Blackfin DSP处理器-BF533的开发详解55:CVBS输入-DSP和ADV7180的应用详解(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 CVBS IN 视频输入 硬件实现原理 CVBS_IN 子卡板连接在 ADSP-EDU-BF53x 开发板的扩展端口 PORT3 和 PORT4 上&#xff0c;板卡插入时&#xff0c;…

[内网渗透]—域外向域内信息收集、密码喷洒

前言 当我们与目标内网建立了socks5隧道后,就可以从域外对域内机器进行信息搜集了,很多工具不用上传到目标机器,也就不易被AV检测到,但是有可能会被一些流量检测设备发现有大量socks5流量。 接下来介绍下如何通过域外对域内进⾏更深的信息搜集:枚举域⽤户、查看域内⽤户…

【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)

一、HBase数据模型 HBase分布式数据库的数据存储在行列式的表格中&#xff0c;它是一个多维度的映射模型&#xff0c;其数据模型如下所示。表的索引是行键&#xff0c;列族&#xff0c;列限定符和时间戳&#xff0c;表在水平方向由一个或者多个列族组成&#xff0c;一个列族中…

[附源码]Python计算机毕业设计红色景点自驾游网站管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

[附源码]Node.js计算机毕业设计古诗词知识学习系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

计算机毕设Python+Vue心理咨询预约系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

医院、诊所看这里,一个分诊屏+叫号系统,实现门诊高效排队叫号

为维系患者候诊秩序&#xff0c;减少插队混乱的情况&#xff0c;医院、诊所等医疗机构会考虑采购智能排队叫号系统。 依照系统预定规则&#xff0c;对门诊患者进行数据排列&#xff0c;医生快捷呼叫&#xff0c;打造现代化有序的绿色门诊。 排队叫号系统&#xff0c;是将软件…

「C#」异步编程玩法笔记-WinForm中的常见问题

目录 1、异步更新界面 1.1、问题 1.2、解决问题 1.3、AsyncOperationManager和AsyncOperation 1.4、Invoke、BeginInvoke、EndInvoke及InvokeRequired Invoke InvokeRequired BeginInvoke EndInvoke 2、死锁 2.1、问题 2.2、 解决方法 2.2.1、不要await 2.2.2、用…