当前位置: 首页 > news >正文

【数据结构--八大排序】之希尔排序

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、希尔定义:
  • 二、希尔排序原理
  • 三、希尔排序原理图
    • 1.gap为3:
    • 2.gap为2:
    • 3.gap为1:
  • 四、细节剖析
      • 第1步:`i=0`; a[tmp] > a[end]不做交换
      • 第2步:`i=1`; a[tmp] > a[end]不做交换
      • 第3步:`i=2`; a[tmp] < a[end]交换
      • 第3步:`i=2`; a[tmp] > a[end] 不交换
      • 第5步:`i=3`; a[tmp] > a[end]不交换
      • 第6步:`i=3`; a[tmp] > a[end]不交换
      • 停止
  • 五、代码展示:
  • 六、测试结果
  • 七、 时间复杂度

在这里插入图片描述

一、希尔定义:

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称 缩小增量排序

二、希尔排序原理

希尔排序的思路是,它通过将待排序的数组分割成多个子序列来进行排序。然后逐步缩小子序列的规模,最终进行一次插入排序,从而实现将整个数组排序的目的,当被排序的对象越接近有序时,插入排序的效率越高。希尔排序利用这一特点,通过将数组变得接近有序,从而提高插入排序的效率。

三、希尔排序原理图

gap值的计算公式:gap=n/3+1;

1.gap为3:

在这里插入图片描述
三组分别进行排序,将较小值换到左边。
在这里插入图片描述
是不是看起来就有序多了。继续缩小gap的值。

2.gap为2:

在这里插入图片描述
第一组:1,8,7
第二组:4,5,9
对两组进行排序:
在这里插入图片描述
看起来更加有序了。继续缩小gap的值。

3.gap为1:

当gap=1时,就相当于插入排序;
在这里插入图片描述
排序后:就是一个有序数组了。
在这里插入图片描述

插入排序在这里插入图片描述

四、细节剖析

我们分析一下gap=2时的具体排序过程:

图中的 tmp>end 指的是 a[tmp] 和 a[end]

第1步:i=0; a[tmp] > a[end]不做交换

在这里插入图片描述
i++;

第2步:i=1; a[tmp] > a[end]不做交换

在这里插入图片描述
i++;

第3步:i=2; a[tmp] < a[end]交换

在这里插入图片描述
在这里就会有一些变化了,end在比较交换完后会执行语句 end -= gap ; 所以,end会继续向前移动gap个位置,再次进行比较交换。从而看起来像是0,2,4位置为一组。

第3步:</fonti=2; a[tmp] > a[end] 不交换

在这里插入图片描述
i++;

第5步:i=3; a[tmp] > a[end]不交换

在这里插入图片描述

第6步:i=3; a[tmp] > a[end]不交换

在这里插入图片描述

停止

i++;这里i的值为4,不满足执行条件 n - gap;退到外层循环,gap的值缩小为1;

五、代码展示:

//希尔排序
//从下标0开始,从0+gap步开始,进行插入排序,
//每次选择一个使用遍历向前寻找是否有比他小的记下位置,最后交换
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){//不符合就向后移动,已经保存到tmp中,不用担心被覆盖if (tmp < a[end]){a[end+gap] = a[end];end -=gap;}else{break;}}a[end + gap] = tmp;}}
}

六、测试结果

在这里插入图片描述

七、 时间复杂度

在这里插入图片描述

http://www.lryc.cn/news/182556.html

相关文章:

  • Linux中生成so库的文件引用另一个so库问题的解决
  • EDI是连接原始电子商务和现代电子商务的纽带
  • 星宿UI2.4资源付费变现小程序源码 支持流量主
  • 代码随想录训练营二刷第四十六天 | 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ
  • python安装第三方模块方法
  • 广西小贷公司设立及小贷牌照申请政策要求
  • PyTorch应用实战二:实现卷积神经网络进行图像分类
  • 面试系列 - Java常见算法(二)
  • Cortex-A9 架构
  • 【C语言】循环结构程序设计(第二部分 -- 习题讲解)
  • UGUI交互组件Toggle
  • 亲,您的假期余额已经严重不足了......
  • 【软件测试】自动化测试selenium(一)
  • Nginx实现动静分离
  • 【算法题】309. 买卖股票的最佳时机含冷冻期
  • 1951-2011年长序列高时空分辨率月尺度温度和降水数据集
  • 十天学完基础数据结构-第六天(树(Tree))
  • RobotFramework流程控制(最新版本)
  • win11 好用的 快捷方式 --chatGPT
  • 在大数据相关技术中,HBase是个分布的、面向列的开源数据库,是一个适合于非结构化数据存储的数据库。
  • 910数据结构(2020年真题)
  • MyBatisPlus(八)范围查询
  • 【day10.04】QT实现TCP服务器客户端搭建的代码
  • milvus 结合Thowee 文本转向量 ,新建表,存储,搜索,删除
  • GEO生信数据挖掘(三)芯片探针ID与基因名映射处理
  • 力扣 -- 96. 不同的二叉搜索树
  • 经典算法-枚举法(百钱买百鸡问题)
  • Gurobi设置初始可行解
  • Zabbix配置监控文件系统可用空间小于30GB自动告警
  • 进程调度算法之先来先服务(FCFS),短作业优先(SJF)以及高响应比优先(HRRN)