希尔排序详解(C语言)

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

希尔排序
希尔排序的基本思想是将数组分割成若干个子序列进行插入排序,然后逐步缩小子序列的间隔,最终将整个数组变成一个有序序列。听起来很难理解对吧?那就让我给你们画个过程吧!
在这里插入图片描述
这是一组待排序的数据(从小到大排),我们首先要将这个序列分成若干个子序列,到底是多少个呢?希尔表示首先要定义一个增量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都要除2for (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格,反向遍历同一组的成员}elsebreak;}}}return 0;
}

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

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

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

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

相关文章

使用防火墙是否可以应对DDoS攻击?

很多游戏行业公司对网络安全不够了解&#xff0c;觉得装个防火墙就可以万事大吉了。实际上使用防火墙确实是解决DDoS攻击问题的一种有效方法&#xff0c;一些更先进的防火墙还可以采用其他防御措施&#xff0c;例如:深度包检测、行为分析、人工智能等&#xff0c;来识别和防御各…

MyBatis见解4

10.MyBatis的动态SQL 10.5.trim标签 trim标签可以代替where标签、set标签 mapper //修改public void updateByUser2(User user);<update id"updateByUser2" parameterType"User">update user<!-- 增加SET前缀&#xff0c;忽略&#xff0c;后缀…

IPC发布IPC-6012F《刚性印制板鉴定和性能规范》

IPC发布IPC-6012F《刚性印制板鉴定和性能规范》 变革解决了刚性印刷板制造工艺的进步 2023年10月18日 下载&#xff1a; IPC-6012F 2023 EN,Qualification and Performance Specification for Rigid Printed Boards.pdf_免费高速下载|百度网盘-分享无限制 文件分享https:/…

基于SpringBoot留守儿童爱心成长守护平台

1 引言 互联网技术的大面积普及使得网络平台成为人们获取信息的主要途径。网络时代的留守儿童们的生活自然与互联网息息相关&#xff0c;因此必然需要符合网络时代特征的新方式来对留守儿童提供帮助[1]。留守儿童平台作为向大众传递信息的一种方式&#xff0c;使得更多人能看到…

基于ssm小区物业管理系统论文

摘 要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#x…

MySQL的安装for windows

一、MySQL的安装for windows 1、安装包的下载2、安装配置3、初始化MySQL数据库4、配置环境变量5、安装Navicat 1、安装包的下载 点击此链接可跳转到对应下载地址https://downloads.mysql.com/archives/community/进入后选择所需版本开始下载&#xff0c;如下图所示&#xff1a…

Spring系列学习二、Spring框架的环境配置

Spring框架的环境配置 一、Java环境配置二、 Spring框架的安装与配置三、Maven与Gradle环境的配置四、IDE环境配置&#xff08;Eclipse与IntelliJ IDEA&#xff09;五、结语 一、Java环境配置 所有编程旅程总是得从基础开始&#xff0c;如同乐高积木大作的基座&#xff0c;首先…

计算机毕业设计------SSM水果蔬菜商城批发网站

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,网站用户管理,新闻公告管理,果蔬类型管理,城市信息管理,配货点管理,果蔬商品管理,果蔬订单管理,果蔬评价管理…

互联科技:全域托管云赋能百行百业的数字化转型

在这个数字经济时代&#xff0c;云计算技术为企业提供了更加高效的业务管理机会&#xff0c;百行百业加速上云。对比几种云网方案&#xff0c;目前公有云方案存在可控性低、数据暴露风险、个性化需求难以满足、服务受限等问题&#xff1b;私有云方案存在建设成本高、建设周期长…

机器学习——决策树(三)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类&#xff0c;要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接&#xff1a;https://pan…

OPNET Modeler帮助文档的打开方式

前面有篇文章修改OPNET帮助文档的默认打开浏览器 & 给Edge浏览器配置IE Tab插件已经提到了打开OPNET Modeler打开帮助文档的方法&#xff0c;有时候打开时会显示如下。 界面中没有什么内容加载出来&#xff01;我是在Google浏览器中打开的&#xff0c;其他的浏览器也是一样…

基于ssm演出人员与观众疫情信息管理系统论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…