希尔排序(重点讲解如何分组)---------通俗易懂,直击重点!!!

2023-10-30


希尔排序的历史

希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由希尔 1959 年公布。
1、希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。


提示:以下是本篇文章正文内容,下面案例可供参考

一、关于希尔排序

1、由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
2、虽然希尔排序的稳定性比较差,但是希尔排序是冲破二次时间屏障的第一批算法之一。
3、简单说一下希尔排序的思路,就我的理解而言:希尔排序首先先分组【我自己称之为“希尔分组”】,之后把分好的组别分别按照直接插入排序的算法来进行排序。【当我自己学习该算法的时候,我首先先列一个数组,之后分组,然后往纸上写代码,找不同分组的共性,然后统一成一片代码】
4、另外强调一点的是,学习该算法之前必须完全先掌握直接插入排序算法。因为希尔算法实在该基础上进行排序的。

链接: 【直接插入排序算法】.

二、希尔排序的思路

、希尔排序:“希尔分组”是根据步长【gap】来分的。


假设有一个数组 {1 ,2,3,4,5,6,7,8,9,0}
第一大组:步长gap=length/2=5;
。。。。。分成五小组,每组有2个数
第二大组:gap=gap/2=5/2=2;
。。。。。分成两小组,每组有5个数
第三大组:gap=gap/2=2/2=1;【直到步长gap=1,才算结束】
。。。。。分成一个组,每组有10个数

、之后就分别对以上各个小组用直接插入排序就可以了。

三、代码实例讲解

代码如下(示例):

void ShellSort(int a[],int length){

	int gap;          //步长
	int i,j,temp,x;
	
	for(gap=length/2;gap>0;gap=gap/2){    //第一个for循环是看需要几次“希尔分组”【注意:每次“希尔分组”直接开始对其进行直接插入排序】
		for(i=0;i<gap;i++){     //第二个for循环是对分组后,就这个大组中有几个小组,就循环几次
			for(j=i+gap;j<length;j=j+gap){    //剩下两个for循环是对那个小组进行的直接插入排序
				for(x=j;x>0;x=x-gap){
					if(a[x]<a[x-gap]){
						temp=a[x-gap];
						a[x-gap]=a[x];
						a[x]=temp;
					}
					else break;   //一定记住:再次强调,一旦一不小心忘了带,
					             //你就需要像我一样进行,长达两三个小时的查错。
					
				}
			}
		}
	}
	
}

总结

。。目前对于希尔排序我就写这么多,我希望看懂的哥们儿自己再总结一边,然后自己写下这个代码。【你不一定写的和我一毛一样,我就和一大部分人写算法程序不一样,但是思路是一样的。虽然有时候自己根据理解写的代码,有可能编译时间很长,但是这也是一种进步。这说明我可以写出自己的代码了,相当于我自己生了个孩子,我骄傲,即使他不是很完美。【博主是男生】,,,,但是在编程的路上我可以把它变得完美】

【还是那句话,一定要自己根据理解自己干一边代码。我相信我们以后会变得越来越好】
【兄弟姐妹们,加油!!!】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

希尔排序(重点讲解如何分组)---------通俗易懂,直击重点!!! 的相关文章

随机推荐

  • Grafana中文版本

    grafana chinese tags GitHub grafana Grafana中文汉化版本 GitHub https github com WangHL0927 grafana chinese 作者 whl email w95866
  • Vuepress码云部署及自动跳转404 的问题

    介绍 VuePress 由两部分组成 一个以 Vue 驱动的主题系统的简约静态网站生成工具 和一个为编写技术文档而优化的默认主题 它是为了支持 Vue 子项目的文档需求而创建的 由 VuePress 生成的每个页面 都具有相应的预渲染静态
  • PyCharm+Docker:打造最舒适的深度学习炼丹炉

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来自 知乎 作者 刘震 链接 https zhuanlan zhihu com p 52827335 编辑 人工智能前沿讲习 一般炼丹都在服务器上 很少有人在本机跑代码的
  • 跨时钟域信号处理(一)--Verilog单比特信号

    网上有很多的跨时钟域信号处理的相关文章 主要分为三种 单比特信号 打两拍或打更多拍 使用触发器 多比特信号 异步双口块RAM或者异步FIFO 格雷码转换 这次就主要说第1种情况 适用于单比特信号 1 应用场景 从时钟域1的单比特信号DATA
  • 【python】动态规划算法学习:0-1背包问题 -牛客网HJ16 购物单

    这里写目录标题 题目HJ16 购物单 问题理解 代码 题目HJ16 购物单 描述 王强决定把年终奖用于购物 他把想买的物品分为两类 主件与附件 附件是从属于某个主件的 下表就是一些主件与附件的例子 主件 附件 电脑 打印机 扫描仪 书柜 图
  • Git(三) Git 图形化管理工具 SourceTree 全部实用操作

    Git 三 Git 图形化管理工具 SourceTree 全部实用操作 上篇文章主要说到Git的账号情况 Getlab账号和Github账号同时使用 本篇文章接着上篇内容继续为大家介绍 Git的图形化管理工具 SourceTree 前言 一
  • 文件下载中文文件名不显示

    使用response setHeader Content Disposition attachment filename fName 下载文件 中文文件名无法显示的问题 今天遇到这么一个情况 在Controller代码中进行文件下载 其中f
  • js 多个if else如何优化?

    function getUserDescribe name if name length gt 3 console log 名字太长 else if name length lt 2 console log 名字太短 else if nam
  • 导入时报错 :No module named ‘tensorflow.contrib‘ 问题的解决

    No module named tensorflow contrib 问题解决 问题描述 在tensorflow contrib模块的调用报错 No module named tensorflow contrib 解决方案 我给删了大不了不
  • [CISCN2019 华北赛区 Day1 Web2]ikun (JWT更改与python反序列化)

    前言 文章所涉及的资料来自互联网整理和个人总结 意在于个人学习和经验汇总 如有什么地方侵权 请联系本人删除 谢谢 本文仅用于学习与交流 不得用于非法用途 题目 提示是要买到Iv6 有很多页面 需要写脚本来找 import requests
  • 基于时间轮片方式处理超时任务

    作者 酱了里个酱 来源 掘金 https juejin im post 5e733e4f51882549417fe9aa 背景 最近收到小伙伴的一个吐槽 项目里的某个函数是同步阻塞的 无法确定其运行时间 某些情况下 可能出现长时间阻塞导致应
  • 计算机视觉与深度学习-全连接神经网络-激活函数- [北邮鲁鹏]

    文章目录 基础知识 为什么需要非线性操作 激活函数 激活函数 vs 数据预处理 常用的激活函数 Sigmoid函数 Logistic函数 双曲正切函数 Tanh函数 线性整流函数 ReLU函数 Leaky ReLU函数 Softmax函数
  • BTC txid与vote的关系

    当我通过BTC的listtransactions接口获取查询最近发生的钱包交易时 需要将用户的充值记录写到数据库时 发现了一些令人巨大的误解 例如 txid字段并不是唯一的 所以写到数据库时 会有交易哈希重复的可能性 有可能你的两个用户在币
  • python处理xml文件

    1 python 操作xml的方式介绍 查看全部包含 三种 法 是xml dom 模块 它是W3CDOMAPI的实现 若需要处理DOMAPI则该模块很适合 是xml sax 模块 它是SAXAPI的实现 这个模块牺牲了便捷性来换取速度和内存
  • matlab中varargout简介

    varargout可以看做 Variable length output argument list 的缩写 在matlab中定义m函数时通过 varargout我们可以得到可变个数个返回值 在matlab命令窗口中输入doc vararg
  • 【H5】Cookie、Session、Token、JWT区别及使用方法

    Token 和 Session 的区别 Session 是一种记录服务器和客户端会话状态的机制 使服务端有状态化 可以记录会话信息 而 Token 是令牌 访问资源接口 API 时所需要的资源凭证 Token 使服务端无状态化 不会存储会话
  • Spring Boot 集成 Flowable 并自定义数据源

    永久链接 https blog kekwy com flowable datasource 问题描述 在使用 flowable spring boot starter 进行 spring boot 集成 flowable 时 flowabl
  • Python爬虫——urllib_post请求百度翻译

    post请求 post的请求参数 是不会拼接在url后面的 而是需要放在请求对象定制的参数中 post请求的参数需要进行两次编码 第一次urlencode 对字典参数进行Unicode编码转成字符串 第二次encode 将字符串数据转换为字
  • 插值法

    插值 根据已知数据点 条件 预测未知数据点的值的方法 1 多项式插值法 多项式插值法 多项式插值法 所求的插值函数是多项式 其中 就是所要求的参数 多项式插值基本公式 求系数 1 1 拉格朗日插值法 设函数 y f x 在区间 a b 上有
  • 希尔排序(重点讲解如何分组)---------通俗易懂,直击重点!!!

    文章目录 希尔排序的历史 一 关于希尔排序 二 希尔排序的思路 三 代码实例讲解 总结 希尔排序的历史 希尔排序按其设计者希尔 Donald Shell 的名字命名 该算法由希尔 1959 年公布 1 希尔排序是基于插入排序的以下两点性质而