希尔排序详解(C语言)

news2025/2/7 9:52:02

前言
希尔排序是一种基于插入排序的快速排序算法。所以如果还会插入排序的小伙伴可以点击链接学习一下插入排序(点我点我!) ,相较于插入排序,希尔排序拥有更高的效率,小伙伴们肯定已经迫不及待学习了吧,那就让我们开始吧!
在这里插入图片描述

希尔排序
希尔排序的基本思想是将数组分割成若干个子序列进行插入排序,然后逐步缩小子序列的间隔,最终将整个数组变成一个有序序列。听起来很难理解对吧?那就让我给你们画个过程吧!
在这里插入图片描述
这是一组待排序的数据(从小到大排),我们首先要将这个序列分成若干个子序列,到底是多少个呢?希尔表示首先要定义一个增量gap(希尔认为应该为数组长度的一半,也有人认为应该是数组的长度的三分之一再+1,我们这里先按照希尔的思路进行讲解),然后按照增量gap分成若干组序列如图:
在这里插入图片描述
这样我们就将其分为了3组,然后每组内成员之间进行插入排序如图:
在这里插入图片描述
那么原数组就变成:
在这里插入图片描述
然后我们让gap/2,在进行新一轮的排序,当gap为1时,就相当于没有分组,直接进行插入排序,我们便可得到最终结果。每一轮排序之后数组就会变得更加有序,而且我们发现插入排序每一次移动只能移动一格,而希尔排序每次移动能移动gap格,所以效率肯定是正常插入排序不能比的。
那么我们要怎样对每一组进行插入排序呢?其实也很简单我们回想一下插入排序的代码是如何实现的:

for (int i = 0; i < size; i++)//size是数组长度
	{
		int end = i;//记录当前位置
		while (end)
		{
			if (arr[end - 1] > arr[end])//交换位置
			{
				int tem = arr[end];
				arr[end] = arr[end - 1];
				arr[end-1] = tem;
				end--;
			}
			else//已经插入退出循环
			{
				break;
			}
		}
	}

这里我们是从0遍历到size-1,每次交换只交换一格,希尔排序也可以从开始就进行遍历,从0遍历到size-gap-1(因为我们要计较arr[end] 和 arr[end + gap]),每次交换交换gap格。只需要稍微修改一下插入排序的代码就可以实现希尔排序。
代码实现:

#include<stdio.h>
int main()
{
	int arr[10] = { 2, 0, 5, 2, 8, 1, 5, 1, 5, 6 };//定义一个数组
	int size = (int)(sizeof(arr) / sizeof(arr[0]));//数组的长度
	int gap = size;
	while (gap > 1)//当gap等于1时已经排好退出循环
	{
		gap /= 2;//每一轮gap都要除2
		for (int i = 0; i <= size - gap - 1; i++)
		{
			int end = i;//记录当前位置
			while (end >= 0)//此时end可以等于0
			{
				if (arr[end] > arr[end + gap])//交换位置
				{
					int temp = arr[end];
					arr[end] = arr[end + gap];
					arr[end + gap] = temp;
					end -= gap;//后退gap格,反向遍历同一组的成员
				}
				else
					break;
			}
		}
	}
	return 0;
}

特点
希尔排序的优势在于它可以在数组较大的情况下提供较高的效率,相对于其他的排序算法,希尔排序的时间复杂度并不稳定,最好情况下可以达到O(nlogn),最坏情况下为O(n^2)。但是比起一般的插入排序显然韩式蛮有优势的。

尾声
看到这里的小伙伴们想必都已经掌握了希尔排序的使用和思路,如果觉得博主讲的不错的话,能不能给博主一个免费的关注,点赞,收藏支持一下呢?博主将持续分享更多知识,关注博主不迷路哦~,我们下期再见!

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

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

相关文章

如何进行安全管理

目录 安全管理 修改ECS实例登录密码 方式一&#xff1a;重置ECS实例密码 方式二&#xff1a;在实例内部修改登录密码 安全组 ECS实例加入安全组的规则 使用安全组 补丁管理 安全管理 如果希望保护网站安全&#xff0c;首先就要保护ECS实例安全&#xff0c;这需要对ECS实…

Transfer Learning(迁移学习)

1. 什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数机器学习算法都…

学生护眼台灯几瓦最好?备考好用护眼台灯推荐

网上有大量关于护眼台灯的话题讨论&#xff0c;像“护眼台灯是智商税”、“台灯伤眼”等话题更是激起了众多用户的热烈讨论。护眼台灯本身是业内公认对眼睛友好的工具&#xff0c;但如今却饱受争议&#xff0c;这和各类不专业护眼台灯脱不开关系&#xff01;因为这类产品不仅选…

十大VSCODE 插件推荐2023

1、海鲸AI 插件链接&#xff1a;ChatGPT GPT-4 - 海鲸AI - Visual Studio Marketplace 包含了ChatGPT(3.5/4.0)等多个AI模型。可以实现代码优化&#xff0c;代码解读&#xff0c;代码bug修复等功能&#xff0c;反应迅捷&#xff0c;体验出色&#xff0c;是一个多功能的AI插件…

Sql 动态行转列

SELECT ID, Name, [Month],auth FROM [Test].[dbo].[Test3] 数据列表&#xff1a; 1.静态行专列 Select auth, MAX( CASE WHEN [Month] 一月 then Name else null end) 一月, MAX( CASE WHEN [Month] 二月 then Name else null end) 二月, MAX…

半导体行业存储高纯酸大规格容器PFA酸缸20L

一、产品介绍 PFA清洗槽是即四氟清洗桶后的升级款&#xff0c;专为半导体光伏光电等行业设计的&#xff0c;一体成型&#xff0c;无需担心漏液。主要用于浸泡、清洗带芯片硅片电池片的花篮。由于PFA的特点它能耐受清洗溶液的腐蚀性&#xff0c;同时金属元素值低&#xff0c;无溶…

HTML代码全解析

HTML代码全解析实例解析 <!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 utf-8。<title> 元…

springCould中的Ribbon-从小白开始【5】

目录 1.什么是Ribbo❤️❤️❤️ 2.eureka自带Ribbon ❤️❤️❤️ 3. RestTemplate❤️❤️❤️ 4.IRule❤️❤️❤️ 5.负载均衡算法❤️❤️❤️ 1.什么是Ribbo 1.Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具。2.主要功能是提供客户端的软件…

Opencv_CUDA实现推理图像前处理与后处理

Opencv_CUDA实现推理图像前处理与后处理 通过trt 或者 openvino部署深度学习算法时&#xff0c;往往会通过opencv的Mat及算法将图像转换为固定的格式作为输入openvino图像的前后处理后边将在单独的文章中写出今晚空闲搜了一些opencv_cuda的使用方法&#xff0c;在此总结一下前…

【模式识别】探秘分类奥秘:K-近邻算法解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

怎么制作电子邀请函_1分钟即可完成h5邀请函

电子邀请函&#xff1a;重塑传统&#xff0c;引领潮流的商务邀请新体验 在数字时代的浪潮中&#xff0c;我们的生活逐渐与数字世界深度融合。不论是购物、办公还是社交&#xff0c;都离不开电子化的操作。而在商务邀请函这一领域&#xff0c;电子邀请函以其独特的魅力&#xf…

Quartz持久化(springboot整合mybatis版本实现调度任务持久化)--提供源码下载

1、Quartz持久化功能概述 1、实现使用quartz提供的默认11张持久化表存储quartz相关信息。 2、实现定时任务的编辑、启动、关闭、删除。 3、实现自定义持久化表存储quartz定时任务信息。 4、本案例使用springboot整合mybatis框架和MySQL数据库实现持久化 5、提供源码下载 …

小白的实验室服务器深度学习环境配置指南

安装nvidia 本文在ubuntu server 22.04上实验成功&#xff0c;其他版本仅供参考 注意&#xff0c;本文仅适用于ubuntu server&#xff0c;不需要图形界面&#xff0c;没有对图形界面进行特殊考虑和验证&#xff01;依赖图形操作界面的读者慎用 查看是否安装了gcc gcc -v若没…

HTTP content-type内容类型的常见格式

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

因吹斯汀!只需上传照片,GPT-4V精准识别食物的卡路里和摄入热量

健身和减肥的朋友有福啦&#xff01; 最近一篇文章探索了GPT-4V在膳食评估领域的强大能力&#xff0c;可以根据饮食图片精准判断食物的种类与重量&#xff0c;并给出营养成分的分析&#xff0c;包括碳水化合物、蛋白质、脂肪占比。 最最重要的是&#xff0c;它还能告诉我们这…

Linux操作系统——进程(四)进程切换与命令行参数

进程切换 概念引入 下面我们先了解几个概念&#xff1a; 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#xff0c;更合理竞争相关资源&#xff0c;便具有了优先级 独立性: 多进程…

解决国内大模型痛点的最佳实践方案

1.前言 自AI热潮掀起以来&#xff0c;国内互联网大厂躬身入局&#xff0c;各类机构奋起追赶&#xff0c;创业型企业纷至沓来。业内戏称&#xff0c;一场大模型的“百模大战”已经扩展到“千模大战”。 根据近期中国科学技术信息研究所发布的《中国人工智能大模型地图研究报告…

关于linux mv指令机制

最近在mv文件的时候&#xff0c;操作失误将生产服务器一个1TB的文件夹mv到了/opt/test目录&#xff0c;因为最后/opt/目录被沾满所以1TB的文件夹没有迁移过来&#xff0c;写入了30GB数据到了/opt/test目录&#xff0c;因为系统分区被沾满&#xff0c;所以把test目录给删除了。 …

交换机端口镜像技术原理与配置

在网络维护的过程中会遇到需要对报文进行获取和分析的情况&#xff0c;比如怀疑有攻击报文&#xff0c;此时需要在不影响报文转发的情况下&#xff0c;对报文进行获取和分析。镜像技术可以在不影响报文正常处理流程的情况下&#xff0c;将镜像端口的报文复制一份到观察端口&…

OpenAI大模型DecryptPrompt

what is prompt 综述1.Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing(五星好评)综述2. Paradigm Shift in Natural Language Processing(四星推荐)综述3. Pre-Trained Models: Past, Present and Future Prompt即…