直接插入排序与希尔排序

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🐻‍❄个人主页🎉:GOTXX

🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉

🕊系列专栏:零基础学习C语言----- 数据结构的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉
————————————————

🎉文章简介:

本篇文章对 直接插入排序与希尔排序 的相关知识详细讲解!

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉


目录

1.直接插入排序

1.1基本思想:

代码实现:

1.2性能分析

1.2.1时间复杂度:

1.2.2空间复杂度:没有空间消耗

2.希尔排序

2.1基本思想:

代码实现:

2.2性能分析

2.2.1时间复杂度

2.2.2空间复杂度


1.直接插入排序

1.1基本思想:

1.假设一个数组中前n-1个数都有序了,将最后一个数插入到前面有序的数组中去,用待插入数与有序数组从后向前依次比较,直到找到比待插入数大(降序)或则小(升序)的数,将该数插到其后面; 

2.一个无序的数组中,将第一个数看成有序的,将第二个数插入到前面,把前面两个变成有序;

3.再将第三个数插入到前面有序数组中,将前三个变成有序;

.......

将最后一个元素插入到前面的数组中去,整个数组就有序了;

图解:

代码实现:
//升序为例
void InsertSort(int a[],int n)
{
	for (int i = 1; i < n - 1; i++)
	{
		int end = i;
		//将最后一个元素保存,避免当倒数第二个数比它大,往后移动时将它覆盖
		int tmp = a[end];
		while (end >= 0)
		{
			//从后向前比较,当比他大时,将该元素往后移动
			if (a[end - 1] > tmp)
			{
				a[end] = a[end - 1];
			}
			end--;
			//当找到比它小的数时,break跳出循环
			if (a[end - 1] <= tmp)
			{
				break;
			}
		}
		//到这里有两种情况,1  end<0 退出循环  2  找到了比它小的数,break跳出循环
		a[end] = tmp;
	}

}

1.2性能分析

1.2.1时间复杂度:


最坏情况,逆序

时间复杂度为:1+2+3+4+……+n-1+n

时间复杂度为:O(N^2)

1.2.2空间复杂度:没有空间消耗

空间复杂度:O(1)

2.希尔排序

2.1基本思想:

先选定一个整数(记作gap)作为间距,把待排序的数据以gap间距分组,并对每一组的数据进行插入排序,然后再缩小间距(gap),当gap最后等于1时,所有数据就有序了;

希尔排序要先进行预排序,预排序完后再进行一次直接插入

当gap>1时,就是预排序;

当gap=1时,就相当于直接插入排序;

预排序:

预排序是在选择排序的思想上,将一组数据以gap为数据间隔分组;如图

再将每一组数据进行直接选择排序;(如下图)

预排序的意义:是让大的数更快到后面去,小的数更快到前面去;如图:

预排序过后,在进行gap为1的直接插入排序之前,数组的数据已经很接近有序了,所以最后一次的直接插入排序在时间上有了优化;

代码实现:
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap>1)
    {
		//当gap>1时,预排序,gap=1时,直接让数组有序;
		gap = gap / 3 +1;

		//一共分为了gap组,需要gap次的插入排序
		for (int j = 0; j < gap; j++)
		{    
            //一组数据的插入排序
			for (int i = j; i < n - gap; i += gap)
			{
				int end = i;
				int tmp = a[end + gap];
				while (end >= 0)
				{
					if (a[end] > tmp)
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}
				a[end + gap] = tmp;
			}
		}
	}
}

2.2性能分析

开始时,gap取值较大,子序列中的元素较少,排序速度快,克服了直接插入排序的缺点;

其次,gap值逐渐变小后,虽然子序列的元素逐渐变多,但大多元素已基本有序,能以近线性的速

度排好序;

2.2.1时间复杂度

根据复杂的数学计算,结论为:

时间复杂度为O(N^1.3)

2.2.2空间复杂度

除了两个数据交换时有空间消耗,就没有多余其他空间的消耗;

最好:有序       空间复杂度为0;

最坏:逆序       空间复杂度为O(N);

平均空间复杂度为O(1)


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4.移位计算,乘除法运算

目录 一. 移位计算 &#xff08;1&#xff09;算数移位 &#xff08;2&#xff09;逻辑移位 &#xff08;3&#xff09;循环移位 二. 乘法运算 &#xff08;1&#xff09;原码的乘法运算 &#xff08;2&#xff09;补码的乘法运算 三. 除法运算 &#xff08;1&#xf…

SpringDataJpa(二)

三、Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架&#xff0c;可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能&#xff0c;且易于扩展&#xff01;学习并使用 Spring D…

Python爬虫-获取汽车之家车家号

前言 本文是该专栏的第9篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly9jaGVqaWFoYW8uYXV0b2hvbWUuY29tLmNuL0F1dGhvcnMjcHZhcmVhaWQ9MjgwODEwNA== 需求:获取汽车之家车家号数据 笔者将在正文中介绍详细的思路以及采集方法,废话不多说,跟着笔者直接往…

GPT-4V:AI在教育领域的应用

OpenAI于9月25日发布了最新的GPT-4V模型&#xff0c;为ChatGPT引入了语音和图像功能&#xff0c;为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验&#xff0c;用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…

React 其他常用Hooks

1. useImperativeHandle 在react中父组件可以通过forwardRef将ref转发到子组件&#xff1b;子组件拿到父组件创建的ref&#xff0c;绑定到自己的某个元素&#xff1b; forwardRef的做法本身没有什么问题&#xff0c;但是我们是将子组件的DOM直接暴露给了父组件&#xff0c;某下…

设计模式之组合模式-创建层次化的对象结构

目录 概述概念主要角色应用场景 组合模式的实现类图NS图基本代码组合模式的精髓意外收获&#xff08;❀❀&#xff09; 应用示例-公司组织架构管理需求结构图代码 组合模式的优缺点优点缺点 总结 概述 概念 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结…

虚幻5.1 常见的效果关闭方式

常见的虚幻效果关闭方式 1.Bloom ProjectSettings->Rendering->Default Settings->Bloom PostProcessVolume->Lens->Bloom 2.Ambient Occlusion/Screen Space Ambient Occlusion(SSAO) ProjectSettings->Rendering->Default Settings->Ambient Occl…

服务器部署 Nacos 获取不到配置浏览器可以访问

服务器部署 Nacos 获取不到配置浏览器可以访问 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c…

基于springboot vue mysql的在线拍卖系统 全套代码 全套文档

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 代码下载链接&#xff1a;https://pan.baidu.com/s/104LjKF7kvhYeooSBk9h65g?pwd8fk4 提取码&#xff1a;8fk4 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技…

【每日一题】318. 最大单词长度乘积-2023.11.6

题目&#xff1a; 318. 最大单词长度乘积 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。如果不存在这样的两个单词&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1…

模拟ASP.NET Core MVC设计与实现

前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说&#xff1a;“我最近在看ASP.NET Core MVC的源代码&#xff0c;发现整个系统太复杂&#xff0c;涉及的东西太多&#xff0c;完全找不到方向&#xff0c;你能不能按照《200行代码&#xff0c;7个对象——让你了解ASP.…

第26期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

【Git】快速入门安装及使用git与svn的区别常用命令

一、导言 1、什么是svn&#xff1f; SVN是Subversion的简称&#xff0c;是一个集中式版本控制系统。与Git不同&#xff0c;SVN没有分布式的特性。在SVN中&#xff0c;项目的代码仓库位于服务器上&#xff0c;团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个文…

Jmeter+ant+jenkins接口自动化测试

平台简介 一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter 支持接口的测试&#xff0c;Ant 支持自动构建&#xff0c;而 Jenkins 支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动…

聊聊室内导航在应用方面

大家去大型的商场时&#xff0c;应该都见过一些提示牌&#xff0c;微信扫一扫导航。当拿微信扫了之后&#xff0c;就会打开一个小程序&#xff0c;里面显示整个商场的二维或三维的平面结构&#xff0c;以及当前自己的位置。此时可以通过手机快速的查看商场内其他的商铺、公共区…

SQL Server SSIS的安装

标题SQL SERVER 安装 下载SQL SERVER数据库&#xff1a;&#xff08;以SQL SERVER 2022 Developer版本&#xff09;(https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads?rtc1) 以administrator权限安装&#xff1a; 下载完成后&#xff0c;会出现以下界面&a…

R语言 PPT 预习+复习

什么狗吧发明的结业考&#xff0c;站出来和我对线 第一章 绪论 吊码没有&#xff0c;就算考R语言特点我也不背&#xff0c;问就是叫么这没用。 第二章 R语言入门 x<-1:20 赋值语句 x 1到20在x上添加均值为0、标准差为2的正态分布噪声 y <- x rnorm (20, 0, 2) 这…

【leaflet】1. 初见

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 概念概念解释特点 2️⃣ 学习路线图3️⃣ html示例&#x1f6ec; 文章小结&#x1f4d6; 参考资料 &#x1f6eb; 导读 需求 要做游戏地图了&#xff0c;看到大量产品都使用的leaflet&#xff0c;所以开始学习这个。 开发环境…

微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系

实际上涉及到了微服务架构中的两个重要概念&#xff1a;服务间通信和项目依赖管理。在微服务架构中&#xff0c;一个项目可以通过两种方式与另一个项目建立依赖关系&#xff1a;通过配置文件&#xff08;如YAML文件&#xff09;和通过项目依赖&#xff08;如POM文件&#xff09…

【每日一题】逃离火灾

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二分枚举空间复杂度&#xff1a; O ( m n ) O(mn) O(mn)。 写在最后 Tag 【二分答案】【BFS】【数组】【2023-11-09】 题目来源 2258. 逃离火灾 题目解读 现在有一个人在一个二维网格的左上角&#xff0c;坐标 (0, 0…