【八大排序(二)】希尔排序(谁说天才都短命?)

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:八大排序专栏⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习排序知识
  🔝🔝


在这里插入图片描述

Shell排序

  • 1. 前言🚩
  • 2. 希尔排序思路🚩
  • 3. 预排序思路讲解🚩
  • 4. 预排序代码实现🚩
  • 5. 对于gap取值的思考🚩
  • 6. 完整的希尔排序🚩
  • 7. 希尔排序算法效率分析🚩
  • 8. 总结🚩

1. 前言🚩

插入排序一般来说是低效的
因为它一次只能挪动一个数据
如果你不知道插入排序可跳转
插入排序

所以Donald Shell(希尔)这个人
对插入排序进行了优化
将插入排序提升了不止一个档次
甚至可以和快速排序平起平坐!

在这里插入图片描述

希尔不仅天资聪慧,并且很长寿
它足足活了91岁!
放在整个天才届也是相当炸裂的存在

(天才数学家阿贝尔已经哭晕在厕所)
阿贝尔简介


2. 希尔排序思路🚩

基本思路:

  • 在直接插入排序上做优化:
    1. 分组预排序,使数组接近有序
    2. 直接插入排序

为什么要这样做?

我们在将插入排序的时候提到:
对于有序的数组
插入排序的时间复杂度为O(N).

所以这里我们先预排序
让数组接近有序再去直接插入排序
这样效率会大大提升!

插入排序讲解链接点击即可访问


3. 预排序思路讲解🚩

希尔是这样想的:

将一个数组按gap分组.
再将分组的值进行插入排序

比如:我们定义一个0~9的无序数组:

int a[10]={9,1,2,5,7,4,8,6,3,5};

假设这里的gap等于3:

在这里插入图片描述
这里,9.5.8.5分为一组
1.7.6 分为一组
2.4.3 分为一组

再将数据: 9.5.8.5进行插入排序
1.7.6进行插入排序
2.4.3进行插入排序

排完后变成了这样:
在这里插入图片描述

单独看红色一组:5.5.8.9.是有序的
单独看绿色一组:1.6.7.也是有序的
单独看蓝色一组:2.3.4.也是有序的
数组整体比刚才有序了,目的达到!


4. 预排序代码实现🚩

当gap等于3时,我们要排三个颜色的组
当gap等于4时,就要排四个颜色的组

我们从内到外,先写排一组数据的代码

for (int i = 0; i < n - gap; i+=gap)//end最多走到n-gap位置{                              //这个数组中end最多到8,这时x=5为最后一个元素int end = i;int x = a[end + gap];//插入排序中gap等于1,就是加一while (end >= 0){if (a[end] > x){a[end + gap] = a[end];end =end-gap;}else{break;}}a[end + gap] = x;}

我们细心观察可以发现:
这里的分组预排和插入的思路是一样的

只不过插入排序的gap等于1而已!

我们可以看看插入排序:

在这里插入图片描述


5. 对于gap取值的思考🚩

gap的取值方法有很多种.
但是每一种gap的取值都满足:

先大后小原则
也就是我们的预排序不止排序一次
gap会由大变小,常见的取值有:

gap=n/2 (n为数组长度)
gap=n/3 (n为数组长度)

比方说用gap=n/2做例子.
当数组长度为100时.我们需要进行:
gap=50.gap=25.gap=12.
gap=6.gap=3.这么多次预排序
直到gap=1,停止预排,进行直接插入


用刚才定义的数组可以得到这样的图:

在这里插入图片描述


6. 完整的希尔排序🚩

有了前面关于,一组数据的插入排序
和对于gap取值的理解后,展现所有代码

// 希尔排序
void ShellSort(int* a, int n)
{//多次预排序加直接插入排序int gap = n;while (gap > 1){gap = gap / 2;//gap = gap / 3 + 1;也可以是gap/3// 多组一锅炖for (int i = 0; i < n - gap; ++i){int end = i;int x = a[end + gap];while (end >= 0){if (a[end] > x){a[end + gap] = a[end];end =end-gap;}else{break;}}a[end + gap] = x;}}
}

对于代码的解释:

1. 对于gap的解释

  • gap=gap/3时要加上1
  • 因为gap/3后的值可能跳过1直接为零

2. 多组数据一锅炖的理解
在这里插入图片描述

  • 这里其实有两种写法来实现gap组预排:

第一种:

for(int j=0;j<gap;j++)
{for (int i = j; i < n - gap; i+=gap){...}
}

这种是先排完红色的一组,再排其他颜色

第二种:

for (int i = 0; i < n - gap; ++i)
{...
}

这种是:
先排红色中的9,再排绿色的1.按照顺序走

  • 不管用哪种方法,效率都是一样的

7. 希尔排序算法效率分析🚩

希尔排序的时间复杂度不好算
因为gap取值方法千变万化
并且每次预排后的直接插入不好估定

一般默认希尔排序的时间复杂度为:

O ( N * log2 N) 或
O (N * log3 N)


但是这里我还是翻阅了一些资料
我发现在严蔚敏先生写的
《数据结构C语言版》

和殷人昆先生写的
《数据结构-用面相对象方法与C++描述》
中给出了一些数据研究:

根据大量实验得出的数据:
时间复杂度范围:

n1.25 ~ 1.6n1.25
也可以直接看作: n1.3

不管是哪个取值
对于插入排序的优化都很明显了!


8. 总结🚩

希尔排序是一个效率非常不错的排序
它与快速排序,堆排序,归并排序
合称"排序四大天王"(我自己定的).
在未来的笔试,面试中会经常遇见它们

在这里插入图片描述


🔎 下期预告:堆排序 🔍

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全工程师需要考什么证吗?

目前网络安全行业&#xff0c;国内都有哪些证书可以考。 一、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09; CISP-PTE即注册信息安全渗透测试工程师&#xff0c;该证书由中国信息安全测评中心颁发&#xff0c;证书是国内唯一认可的渗透测试认证&#xff0c;专业性…

网络安全有哪些岗位?如何成为一名优秀的网络安全工程师?

网络安全是什么&#xff1f; 首先说一下什么是网络安全&#xff1f;其中&#xff0c;网络安全工程师工作内容具体有哪些&#xff1f; 网络安全 确保网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而受到破坏、更改、泄露&#xff0c;系统…

为什么说,网络安全工程师是网安行业的天花板?

为什么说&#xff0c;网络安全工程师是网安行业的天花板&#xff1f; 最近看到网上有很多人在问诸如&#xff1a;“怎样成为网络信息安全工程师”等相关问题&#xff0c;甚至还有人说“网络安全工程师已经成为这个行业的天花板”&#xff0c;这可能与近几年网络安全事件频发&a…

网络安全工程师必备的七大技能

网络安全有多重要 网络安全非常重要&#xff0c;因为在现代社会中&#xff0c;人们日常生活中的很多方面都与网络有关。随着互联网和数字技术的不断发展&#xff0c;人们已经变得越来越依赖网络&#xff0c;网络已经成为了商业、金融、通信、交通、能源、医疗、教育等各个领域…

软考网络工程师

网络工程师备考经验 2022年上半年网络工程师的考试已经接近尾声&#xff0c;成绩也在7月23号出来了&#xff0c;本人运气很好&#xff0c;在这次考试中取到了满意的成绩&#xff0c;下面是查询结果。 配套资料&#xff1a; 链接: https://pan.baidu.com/s/1b486ZUOYpjsNN-9oK…

网络安全工程师是做什么的?

顾名思义&#xff0c;网络安全工程师主要是维护网络的安全和稳定&#xff0c;对网页篡改、计算机病毒、系统非法入侵、数据泄密、网站欺骗、服务瘫痪、漏洞非法利用等信息安全事件进行维护。从社会角度来看&#xff0c;网络安全工程师在维护个人信息安全和解开黑客攻击上发挥着…

网络安全有哪些岗位,如何成为一位优秀的网络安全工程师?

网络安全是什么&#xff1f; 首先说一下什么是网络安全&#xff1f; 网络安全工程师工作内容具体有哪些&#xff1f; 网络安全是确保网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而受到破坏、更改、泄露&#xff0c;系统连续可靠正常地…

网络安全工程师和网络工程师一样吗(网络安全工程师与网络工程师)

前言 今天给各位分享网络安全工程师和网络工程师一样吗的知识&#xff0c;其中也会对网络安全工程师与网络工程师进行解释&#xff0c;如果能碰巧解决你现在面临的问题&#xff0c;别忘了关注本站&#xff0c;现在开始吧&#xff01;本文目录一览&#xff1a; 1、网络工程师、网…

如何成为一名合格的网络安全工程师?需要掌握那些能力?

近期网络的迅速发展&#xff0c;网络安全成为了一个备受关注的话题。随之而来的是网络安全工程师这个职业的兴起。成为一名合格的网络安全工程师需要具备哪些能力呢&#xff1f;下面我们来一一探讨。 首先 网络安全技术方面是网络安全工程师必须掌握的能力之一。网络安全技术…

网络安全工程师考证指南

已经到2023年了&#xff0c;那么信息安全类证书最有前途的有哪些呢&#xff1f;今天和大家一起聊聊这个话题&#xff01; 1.CISP(国家登记的信息安全专业人员) 就CISP而言&#xff0c;安全实践者基本耳闻&#xff0c;算是国内权威认证&#xff0c;毕竟有政府背景为认证做背书…

网络安全工程师需要具备的5个重要技能

网络安全工程师需要具备的5个重要技能 大数据时代&#xff0c;网络安全非常重要&#xff0c;越来越多的企业也越来越重视网络安全&#xff0c;而网络安全工程师也成为现在需求量比较大的职业&#xff0c;成都也有很多专门做网络安全培训的学校&#xff0c;为这个行业的发展输送…

【网络工程师】<软考中级>网络安全与应用

目录 一、网络安全应用&#xff1a; 1.网络安全威胁和漏洞类型&#xff1a; 2.网络安全信息数据的五大特征&#xff1a; 3.网络安全基本技术&#xff1a; 二、信息加密技术&#xff1a; 1.现代信息加密技术&#xff1a; 2.现代信息加密技术对称密钥总结表&#xff1a; …

网络安全工程师做什么?

​ 网络安全很复杂。数字化转型、远程工作和不断变化的威胁形势需要不同的工具和不同的技能组合。 系统必须到位以保护端点、身份和无边界网络边界。负责处理这种复杂安全基础设施的工作角色是网络安全工程师。 简而言之&#xff0c;网络安全工程师是负责设计和实施组织安全系…

怎么用AI自动写作文?试试这几款软件

我在工作的过程中经常需要频繁地写一些奇怪的文章&#xff0c;比如描述某种产品的使用方法、写一篇关于某种话题的分析报告。由于这些文章内容相对单一&#xff0c;且工作量大&#xff0c;我在撰写的不仅费时费力&#xff0c;甚至还有点力不从心。于是&#xff0c;我便想到可以…

PCL-点云处理(一)

PCL—点云处理&#xff08;一&#xff09; PCL—综述—三维图像处理 点云模型与三维信息点云库对滤波算法的实现PCL—点云分割&#xff08;RanSaC&#xff09;-低 点云分割RanSaC算法PCL中基于RanSaC的点云分割方法PCL—点云分割&#xff08;邻近信息&#xff09;-低 1.确定领域…

知识图谱基础知识(一): 概念和构建

推荐&#xff1a; 知识图谱构建技术一览 知识图谱基础知识之三——知识图谱的构建过程 目录 一、什么是知识图谱 二、知识图谱的分层架构 三、知识图谱构架技术 &#xff08;一&#xff09;数据获取&#xff08;Data Acquisition&#xff09; &#xff08;二&#xff0…

脑机接口实例一:脑电信号分类

文章目录 前言一、eeglab插件-脑电信号的可视化显示二、信号输入1.信号处理2.eeglab可视化显示 三、特征提取总结 前言 基于PCA&#xff0c;ICA&#xff0c;CSP等相关算法&#xff0c;以及FIR、IIR等相关滤波的学习&#xff0c;开始下一阶段&#xff0c;脑机接口的实战化训练与…

C语言每日一题(四)

C语言作为嵌入式Linux开发的必备工具&#xff0c;作为嵌入式Linux开发的基础语言&#xff0c;那么在面试嵌入式工程师时C语言定是面试中的重中之重 。作为一名大三的老学长&#xff0c;不得不为找工作做必要准备。每天做一道C语言面试题&#xff0c;为面试打基础。 本来还想着…

一周信创舆情观察(5.6~5.9)

一、一周舆情要点 5月9日,工信部部长肖亚庆表示,加快发展超高清视频产业,能够直接带动制播设备、终端产品、显示面板、芯片等产业链整体换代,促进数字技术创新突破,对于推动构建以国内大循环为主体、国内国际双循环相互促进的新发展格局,具有重要意义。要加快全产业链优…

谈古论津丨席厂下坡

在河北区天泰路和南口路之间&#xff0c;有一条名字特别奇怪的路&#xff0c;名为“席厂下坡”&#xff0c;大概在2010年之前&#xff0c;席厂下坡上还有个席厂小学&#xff0c;但先后改名为天泰小学和育婴里二小了。小时候一直不明白这条路为何叫“席厂”&#xff0c;还以为以…