希尔排序的增量和缩小增量问题

对于这个问题,我犹豫了很久。现在鼓起勇气来聊一聊。但是我仍然觉的自己会说不好。这里藏着一些令人惊讶的东西,一直沉睡在没有被注意的角落里。

现在不用y_tab解释器。直接用c 语言。

void shellsort(int a[], int n)
{int i,j,t, gap=n;for(gap/=2;gap>0;gap/=2) {printag(a, n, gap);for(i=gap; i<n; i++) {t =a[i];j=i-gap;while(j>=0) {if(a[j]>t) {a[j+gap]=a[j];}else {break;}j-=gap;}a[j+gap]=t;
if(i%gap==gap-1) printag(a, n, gap);}
if(i%gap!=0) printag(a, n, gap);printa(a,n);}
}

为了观察运行过程,插入了一些打印语句,printa()是打印数组。printag()是什么?

void printag(int a[], int n, int gap)
{int i=0;int g=0;if(gap<=1) return;printf("-:\n");while(i<n) {printf("%2d ", a[i++]);if(++g==gap) {printf("\n"); g=0;}}printf("-END\n");
}

每遇到一次gap输出一个换行符的printa()。

这样原来的数组,输出为n/gap行, gap列的矩阵。注意这个除法有余数。最后一行会有参差。

大家早已知晓,希尔排序最外层循环直接拿掉。里面出现gap的地方直接改为1,就变成了直接插入排序。执行的结果也得到一个正确排序的序列。那么,把流程故意弄复杂,的意图究竟是什么?

说复杂,是因为暂时还没有掌握正确读它的方法。等一会儿掌握了,就不再复杂,而是很清楚了。刚才说到printag(),把一个单行的数组输出为 gap列的矩阵。暂时忽略最后一行参差不齐的问题。

好了,矩阵有行向量,列向量两种分解的方法。现在按列向量来分。列向量是不是比原来的数组短?对含有gap个列向量的向量组逐个做排序会怎么样?这就是第2层循环
for(i=gap; i<n; i++) {…,这个循环所做的。想象一下,对每一个列向量都开一个直接插入排序“线程”,每个线程插入完一个数据,就轮换给下一个线程。这就是上面循环所做的事情。

然后增量"gap"要缩小一半。这是最外层的循环。也是说排序好的半gap相邻的列向量要镶嵌合并,变成长度增加一倍,数目减少一半的又一个矩阵。这个收缩是有限度的,"gap"缩到1就结束了。

而在这个镶嵌变化了的列向量上做排序是有特殊规律的。镶嵌排列的列向量有间隔的排序关系,再做一遍插入排序基本上都在就地重排意义上完成,而不能穿透。

这个最好直接看运行实例。下面给出16个数据的排序经过:
57 13 31 18 19 9 14 71 11 17 69 7 3 2 8 97 END
-:
57 13 31 18 19 9 14 71
11 17 69 7 3 2 8 97
-END
-:
11 13 31 7 3 2 8 71
57 17 69 18 19 9 14 97
-END
11 13 31 7 3 2 8 71 57 17 69 18 19 9 14 97 END
-:
11 13 31 7
3 2 8 71
57 17 69 18
19 9 14 97
-END
-:
3 2 8 7
11 13 31 71
57 17 69 18
19 9 14 97
-END
-:
3 2 8 7
11 13 31 18
57 17 69 71
19 9 14 97
-END
-:
3 2 8 7
11 9 14 18
19 13 31 71
57 17 69 97
-END
3 2 8 7 11 9 14 18 19 13 31 71 57 17 69 97 END
-:
3 2
8 7
11 9
14 18
19 13
31 71
57 17
69 97
-END
-:
3 2
8 7
11 9
14 18
19 13
31 71
57 17
69 97
-END
-:
3 2
8 7
11 9
14 18
19 13
31 71
57 17
69 97
-END
-:
3 2
8 7
11 9
14 18
19 13
31 71
57 17
69 97
-END
-:
3 2
8 7
11 9
14 13
19 18
31 71
57 17
69 97
-END
-:
3 2
8 7
11 9
14 13
19 18
31 71
57 17
69 97
-END
-:
3 2
8 7
11 9
14 13
19 17
31 18
57 71
69 97
-END
-:
3 2
8 7
11 9
14 13
19 17
31 18
57 71
69 97
-END
3 2 8 7 11 9 14 13 19 17 31 18 57 71 69 97 END
2 3 7 8 9 11 13 14 17 18 19 31 57 69 71 97 END

而列向量的观点,用c++来表达,就是:

void shellsort2(int a[], int n)
{class colvec {public:int *a;int n;int m;int col;public:colvec(int *arr, int len, int gap, int icol) {a=arr; n=len/gap +(len%gap>icol); m=gap; col=icol;}int & operator[](int i) { return a[m*i+col]; }int length() {return n;}};int i,j,t, gap=n;for(gap/=2;gap>0;gap/=2) {for(i=0; i<gap; i++) {colvec p(a, n, gap, i);int n = p.length();for(j=1; j<n; j++) {int k=j;t =p[k--];while(k>=0) {if(p[k]>t) {p[k+1]=p[k];}else {break;}k--;}p[k+1]=t;}}printa(a,n);}
}

class colvec代表列向量。这里清楚地看到,希尔排序内层一字不差的照搬了直接插入排序。

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

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

相关文章

Maya---骨骼绑定

调节骨骼大小 回车键确认骨骼 FK子集跟父集走 IK子集不跟父集走 前视图中按shift键添加骨骼 清零、删除历史记录&#xff0c;创建新的物体

多元线性回归【正规方程/sklearn】

多元线性回归【正规方程/sklearn】 1. 基本概念1.1 线性回归1.2 一元简单线性回归1.3 最优解1.4 多元线性回归 2. 正规方程求最优解2.1 线性回归的损失函数&#xff08;最小二乘法&#xff09;2.2 推导正规方程2.3 正规方程练习2.4 使用sklearn计算多元线性方程2.5 凸函数 3. 线…

哪款宠物空气净化器噪音低?希喂、美的、安德迈测评分享

今年双11&#xff0c;宠物空气净化器到底应该如何选&#xff1f;在所有的家电品类里&#xff0c;宠物空气净化器算是比较特殊的那个&#xff0c;产品迭代太快&#xff0c;我们把今年双11在售的各大主流品牌的宠物空气净化器统一汇总整理&#xff0c;发现基本一多半都是24年下半…

【Unity 安装教程】

Unity 中国官网地址链接 Unity - 实时内容开发平台 | 3D、2D、VR & AR可视化https://unity.cn/首先我们想要安装Unity之前&#xff0c;需要安装Unity Hub&#xff1a; Unity Hub 是 Unity Technologies 开发的一个集成软件&#xff0c;它为使用 Unity 引擎的开发者提供了一…

使用Angular构建动态Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Angular构建动态Web应用 1 引言 2 Angular简介 3 安装Angular CLI 4 创建Angular项目 5 设计应用结构 6 创建组件…

Nature Communications|一种3D打印和激光诱导协同策略用于定制功能化器件(3D打印/激光直写/柔性电子/人机交互/柔性电路)

美国密苏里大学机械与航天工程系Jian Lin团队,在《Nature Communications》上发布了一篇题为“Programmed multimaterial assembly by synergized 3D printing and freeform laser induction”的论文。论文内容如下: 一、 摘要 在自然界中,结构和功能材料经常形成程序化的三…

《面向对象系统分析与设计》三级项目

文章目录 一、项目总体要求<设计模式应用>第一次文档要求第二次文档要求 二、示例第一次文档 - 设计原则应用1、题目描述2、设计:(1&#xff09;优化理由陈述(2&#xff09;类图(3)实现代码 第二次文档 - 设计模式应用1、题目描述2、设计:(1) 优化理由陈述(2&#xff09;…

【虚幻引擎UE】UE5 音频共振特效制作

UE5 音频共振特效制作 一、基础准备1.插件准备2.音源准备 二、创建共感NRT解析器和设置1.解析器选择依据2. 创建解析器3. 创建解析器设置&#xff08;和2匹配&#xff09;4.共感NRT解析器设置参数调整5.为共感NRT解析器关联要解析的音频和相应设置 三、蓝图控制1.创建Actor及静…

短剧AI突围战,百度跑偏了

“ 百度短剧的Agent对话功能并不属于颠覆性创新&#xff0c;只是新插件&#xff0c;对短剧行业市场格局影响不大&#xff0c;最多只能算用户痒点。 ” 转载&#xff1a;科技新知 原创 作者丨晓伊 编辑丨蕨影 你是否有过这样的体验&#xff1f; 刷短剧时&#xff0c;因剧情曲…

解决运行jar错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

报错 众所周知jdk8以上都没有Javafx java -jar target/myyscan-1.0-SNAPSHOT.jar 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序解决 https://gluonhq.com/products/javafx/ 去下载/javafx/到本地&#xff0c;选择自己的型号 然后记得指定路径 java --m…

TPLCM柔性屏自动化贴合应用

在当前的显示屏制造领域&#xff0c;TP&LCM贴合技术是推动产品升级和满足市场需求的关键环节。随着技术的不断进步&#xff0c;全贴合技术因其卓越的显示效果和用户体验&#xff0c;逐渐成为中高端产品的标配。然而&#xff0c;这一技术的高精度要求和复杂工艺也带来了诸多…

【C++ 算法进阶】算法提升七

目录 正数数组中那两个数&结果最大 &#xff08;贪心&#xff09;题目题目分析代码详解 最小相机覆盖问题 &#xff08;二叉树递归套路&#xff09;题目题目分析代码详解 拼接字符串 &#xff08;动态规划 前缀树&#xff09;题目题目分析代码详解 正数数组中那两个数&…

SpringBoot实现 License 认证(只校验有效期)

文章目录 一、License介绍二、授权者生成密钥对三、授权者生成license.lic证书3.1、 配置pom.xml3.2 、License生成类3.3 、License生成类需要的参数类3.4、自定义KeyStoreParam3.5、main方法生成license.lic注意事项 四、使用者配置4.1、配置pom.xml4.2、License校验类4.3、Li…

室内地图制作-电子地图管理系统源代码公开-室内地图 开源-SDK调用指南(二)

一、室内外电子地图可视化制图项目需求 室内外地图开发需满足开发者可以在Android、iOs、web应用中加入地图相关的功能&#xff0c;包括&#xff1a;地图展示、地图交互、在地图上绘制路线、POI点、搜索、AR导航、蓝牙点位、离线地图等功能。 在开源室内地图编辑-电子地图管理…

Docker安装Mysql5.7,解决无法访问DockerHub问题

Docker安装Mysql5.7&#xff0c;解决无法访问DockerHub问题 简介 Docker Hub 无法访问&#xff0c;应用安装失败&#xff0c;镜像拉取超时的解决方案。 摘要 &#xff1a; 当 Docker Hub 无法访问时&#xff0c;可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的…

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相

随着AR/VR技术逐渐成熟并被更多消费者接受,2024年第二季度(Q2)成为这一领域的一个重要转折点。根据国际数据公司(IDC)发布的最新报告,整个AR/VR市场在本季度经历了显著的增长。接下来,我们将深入探讨Apple Vision Pro在这股增长浪潮中的具体表现。 市场背景 2024年Q2,…

第五届光学与图像处理国际学术会议(ICOIP 2025)征稿中版面有限!

第五届光学与图像处理国际学术会议&#xff08;ICOIP 2025&#xff09; 2025 5th International Conference on Optics and Image Processing (ICOIP 2025&#xff09; 重要信息 时间地点&#xff1a;2025年4月25-27日丨中国西安 截稿日期&#xff1a;2024年12月16日23:59 …

maven本地打jar包依赖

本地工程的pom文件中引入了mysql依赖&#xff0c;但是在maven库中没有拉下来&#xff0c;可以到mysql官网下载jar包&#xff0c;使用maven手动打包到本地仓库中&#xff1a; 官网地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 在jar包所在位置的路…

揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器

目录 &#x1f680;0.前言 &#x1f688;1.string 构造函数 &#x1f69d;1.1string构造函数 &#x1f69d;1.2string拷贝构造函数 &#x1f688;2.string类的使用 &#x1f69d;2.1.查询元素个数或空间 返回字符串中有效字符的个数&#xff1a;size lenth 返回字符串目…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…