排序——插入排序、希尔排序

news2025/1/18 17:16:41

目录

一.插入排序

1.实现

2.时间复杂度

二.希尔排序

2.预排序

(1).单次预排序的实现

(2).相对有序

2.代码


一.插入排序

1.实现

正如其名,是将第n+1个数据插入到前面的n的升序(降序)数据中,形成一个n+1大小的升序(降序)序列。

由于前面的n个数据为升序,那么我们只需要将第n+1个数据依次与前n个进行比较,当比他小时便可以停止比较进行插入,无须继续与前面的数据比较。

void Swap(int* m, int* n)
{
	int mid = *m;
	*m = *n;
	*n = mid;
}
for (int j = n; j > 0; j--)
{
	if (a[j] < a[j - 1])
		Swap(&a[j], &a[j - 1]);
	else
		break;
}

那么,若是想要完成一段无序数组的排序,我们只需要从第二个元素开始进行插入即可(第一个元素本身就是有序的)。

void InsertSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		for (int j = i; j > 0; j--)
		{
			if (a[j + 1] < a[j])
				Swap(&a[j], &a[j + 1]);
			else
				break;
		}
	}
}

2.时间复杂度

当每一次排序都需要末尾元素与前面每一个元素进行比较时,时间复杂度最大,精确为2+3+4+5+...+n,所以最差时间复杂度为O(N^2)。

但当这个数组本身就为有序,那么这时时间复杂度最佳为O(N)(因为即使有序,我们也要遍历一遍来比较一次)。

同时,我们也可以得知,当数组接近有序时,时间复杂度会降低。



二.希尔排序

希尔排序,便是由希尔这个人提出来的,其实是插入排序的一种优化。

在上面,我们得知,当数组接近有序时,时间复杂度会降低。而这种排序,是在进行插入排序之前,通过预排序将数组变得接近有序。


2.预排序

那么什么是预排序呢?

预排序是将间隔为gap的元素分为gap组,分别进行插入排序,从而使整个数组变得相对有序。

(1).单次预排序的实现

例如我们令gap=3

 这样,我们便将这组数据分为了三组

其中每一组的排序和插入排序类似

for (int i = 0; i < n - gap; i += gap)
{
	for (int j = i; j >= 0; j -= gap)
	{
		if (a[j + gap] < a[j])
			Swap(&a[j], &a[j + gap]);
		else
			break;
	}
}

之后我们队每一组数据来进行排序

第一组

第二组

第三组

 

for(int k = 0; k < gap; k++)
{
    for (int i = k; i < n-gap; i+=gap)
    {
	    for (int j = i; j >= 0; j-=gap)
	    {
	    	if (a[j + gap] < a[j])
		    	Swap(&a[j], &a[j + gap]);
		    else
			    break;
    	}
    }   
}

 当然,我们没有必要真的在代码中将其分为三部分来排序,我们只需要将每一个数据与前面间隔gap的一些数据比较即可

for (int i = 0; i < n - gap; i++)
{
    for (int j = i; j >= 0; j-=gap)
	{
	    if (a[j + gap] < a[j])
			Swap(&a[j], &a[j + gap]);
		else
		    break;
    }
}   

如此,我们便能实现一次预排序。

(2).相对有序

在预排序过后,整个数组会变得相对有序

那么gap为多少时更加有序呢?

这个很容易得知,gap越大,更加相对无序,而gap越小,就更加相对有序,当gap为1时,便直接成为插入排序

因此,我们可以进行多次预排序(gap由大到小),最后进行插入排序(gap=1)

而这个gap的值,我们可以定为 n / 2,而为了进行多次预排序,我们可以每次使 gap/=2(gap/=3+1),这样也会使得最终gap为1,从而进行插入排序。


2.代码

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;
		for (int i = 0; i < n - gap; i++)
        {
            for (int j = i; j >= 0; j-=gap)
	        {
        	    if (a[j + gap] < a[j])
        			Swap(&a[j], &a[j + gap]);
        		else
        		    break;
            }
        }   
	}
}

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

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

相关文章

用于宏观经济数据分析的神经网络(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 宏观经济时间序列的分析和预测是国家决策者非常感兴趣的因素。然而&#xff0c;由于缺乏精确的经济模型和外部因素&#xff08…

浏览器隐藏滚动条(不影响内容滚动)

系列文章目录 文章目录系列文章目录一、背景和效果图如下&#xff1a;1.背景2.设置属性前效果图&#xff1a;2.设置后效果图&#xff1a;二、直接通过CSS修改样式&#xff0c;保存滑动功能1.全局设置滚动条如下&#xff08;所有的都被隐藏&#xff09;Css代码如下效果图如下2.给…

DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID读卡器芯片 兼容替代CLRC663

DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID读卡器芯片 兼容替代CLRC663 DP1363F是一款高度集成的非接触读写芯片&#xff0c;集强大的多协议支持、最高射频输出功率&#xff0c;以及突破性技术低功耗卡片检测等优势于一身&#xff0c;满足市场对更高集成度、更小外壳和…

Mybatis 异常总结

java.sql.SQLSyntaxErrorException: #42000 一般发生在修改 删除中 原因可能是 传入的参数与 sql 语句不匹配 It’s likely that neither a Result Type nor a Result Map was specified 异常分析&#xff1a; 关键在第一段提示&#xff1a; It’s likely that neither a Re…

Yolov5移植树莓派4B问题总结

Hallo&#xff0c;大家好啊&#xff01;之前出过几篇文章关于Yolov5的&#xff0c;不得不说Yolov5的识别率真的很高&#xff0c;对个体检测很有帮助&#xff0c;如果大家训练完之后会发现获得一个pt文件&#xff0c;这就是训练好的模型。但是&#xff0c;这个模型只能够在自己的…

Golang 【basic_leaming】2 语言容器

阅读目录Go 语言数组_定义_初始化_遍历定义数组Go 语言初始化数组Go 语言遍历数组参考文献Go 语言切片&#xff08;Slice&#xff09;初始化_删除元素_遍历什么是切片声明切片使用 make() 函数构造切片使用 append() 函数为切片添加元素从数组或切片生成新的切片从指定范围中生…

Unreal Engine中的UHT和UBT

UBT&#xff1a;附加在引擎之外的一个自定义工具&#xff0c;用于管理跨各种构建配置&#xff0c;来配置和构建UE源码的过程。 UHT&#xff1a; 目录 UBT&#xff08;UnrealBuilderTool&#xff09; UHT&#xff08;UnrealHeadTool&#xff09; UBT&#xff08;UnrealBuilder…

《第三堂棒球课》:MLB棒球创造营·棒球名人堂

田中将大 田中将大(Tanaka Masahiro)&#xff0c;1988年11月1日出生于兵库县伊丹市&#xff0c;日本职业棒球运动员。 在2006年日本职棒高中生选秀会上被东北乐天金鹰队第一指选中&#xff0c;此后开始职业生涯。在2014年被纽约洋基队以上亿巨额签约&#xff0c;期限为七年。…

混合云运维,实现批量自动化配置

随着企业业务规模扩大和复杂化及云计算、大数据等技术不断发展&#xff0c;企业希望通过上云加速其数字化转型&#xff0c;以私有云为数据存储&#xff0c;保障安全&#xff0c;同时兼顾公有云的计算资源&#xff0c;公有云和私有云融合&#xff0c;混合云逐渐成为企业的大多数…

SpringBoot改动后0.03秒启动

SpringBoot改动后0.03秒启动 一、概述 GraalVM 是一种高性能运行时&#xff0c;可显着提高应用程序性能和效率&#xff0c;非常适合微服务. 对于 Java 程序 GraalVM 负责将 Java 字节码编译成机器码&#xff0c;映像生成过程使用静态分析来查找可从主 Java 方法访问的任何代码…

详细讲解MySQL在Linux中的部署(Centos为例)

本篇文章详解Mysql在Linux中的部署&#xff0c;以便于能够在SQLyog中远程连接MySQL服务&#xff0c;具体步骤如下所示&#xff1a; 1.查找并卸载mariadb 由于Centos7中自带mariadb&#xff0c;而mariadb是MySQL的一个分支&#xff0c;因此&#xff0c;按照MySQL前必须卸载mar…

【C++初阶】string的模拟实现

文章目录string的介绍string的模拟实现string类的成员变量Member functionsconstructor&#xff08;构造函数&#xff09;destructor&#xff08;析构函数&#xff09;operator(给创建出来的对象赋值)Iterators&#xff08;迭代器&#xff09;beginendCapacitysizecapacityrese…

Oracle --- 基础

目录 启动Oracle Oracle监听 监听服务的主要文件 listener.ora tnsnames.ora sqlnet.ora Oracle用户 创建用户 启动Oracle 四步 su - oracle # 切换用户&#xff0c;进入oracle的用户&#xff0c;读取oracle的配置文件lsnrctl start # 启…

手把手教您从建模到仿真计算优化改进新能源汽车电驱动系统转子冲片强度

导读&#xff1a;新能源汽车电驱动系统的主驱电机&#xff0c;正在向高功率密度、高扭矩密度、高效率、低成本、低损耗、轻量化、小型化、集成化、系列化等方向发展。这给各大零部件供应商&#xff0c;提出了一个又一个的新问题和新挑战。 为了降低结构尺寸、重量、原材料成本…

帮你拿下offer的软件测试面试技巧 赶紧码住!

想要进入一家软件类公司&#xff0c;拿到软件测试这方面岗位的offer&#xff0c;除了专业的技术知识过硬之外&#xff0c;必要的软件测试面试技巧也是少不了的&#xff0c;那么测试人们在面试过程中又应该如何作答呢&#xff1f; 这些可以帮你拿下offer的软件测试面试技巧记得不…

北斗导航 | ION GNSS+ 2014到 ION GNSS+ 2017会议论文下载:ION 美国导航学会

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 后文有 ION GNSS+ 2014、2015、2016、2017论文下载百度云链接美国导航学…

路由选择协议(计算机网络)

目录 理想的路由算法 关于最佳路由 从路由算法的自适应性考虑 互联网分层路由 分层路由和自治系统 边界网关协议 BGP 理想的路由算法 算法必须是正确的和完整的 算法在计算上应简单 算法应能适应通信量和网络拓扑的变化&#xff0c;这就是说&#xff0c;要有自适应性 算法…

Java高效率复习-MyBatis[MyBatis]

前言 ORM是持久化映射框架&#xff0c;但是MyBatis的本质并不是ORM框架。 如何使用MyBatis执行数据库语句 依赖导入 首先如果是Maven工程&#xff0c;则导入JDBC的依赖以及MyBaits的核心依赖。 <packaging>jar</packaging> <dependencies><dependenc…

Struts2漏洞 - Struts2-015 Struts2-016 Struts2-045

文章目录Struts2简介Struts2历史漏洞Struts2历史漏洞发现Struts2框架识别Struts2历史漏洞利用Struts2-015漏洞简介影响范围环境搭建漏洞复现Struts2-016漏洞简介影响范围环境搭建漏洞复现Struts2-045漏洞简介影响范围环境搭建漏洞复现Struts2简介 Apache Struts是美国阿帕奇&a…

制造管理系统在企业生产中的应用——百数制造系统

随着经济全球化程度的加深&#xff0c;企业对信息化的需求大大增加&#xff0c;对信息的集成度和管理要求也更加严格&#xff0c;信息化已经成为制造企业持续提升核心竞争力的必然趋势。数字化的制造管理系统在多年前一出现就赢得不少企业管理者的认可&#xff0c;再加上数字化…