希尔排序,详细解析(附图解)

embedded/2024/10/9 17:27:35/

1.希尔排序思路

希尔排序是一种基于插入排序的算法,通过将原始数据分成若干个子序列,然后对子序列进行插入排序,逐渐减小子序列的间隔,最后对整个序列进行一次插入排序。
 

1.分组直接插入排序,目标接近有序-----------gap>1

2.直接插入排序,目标有序-----------------------gap=1

2.分组排序思路分析

假设固定gap=3,那么以下数组可以分为三组

每一组都使用用直接插入排序,使数据有序

最后三组都排完后数组变成了:0,2,1,4,3,6,5,7,8,此时的结果接近有序

此时只需要再调用一次插入排序,即可让整个数组变得有序。

下面我们来实现一下这个

2.1思路代码

void ShellSort(int* a, int n)
{int gap = 3;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");}
}

在每一组排序后都打印一下来观察

2.2结果显示

3.gap的设定

当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
 

当我们不再固定gap而是让他变化时,如下图gap=gap/2;

3.1动图演示

一般现在认为gap=gap/3+1较为合适,我们以此来实现一下代码

3.2最终代码实现

这里省去了一层for循环,把原本一组一组交换变为了组之间交替交换,时间复杂度没有改变。

//升序
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){if (a[end] > a[end + gap]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

4.时间复杂度

记忆:O(N^1.3)

比O(N*logN)大,比O(N^2)小

希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定


http://www.ppmy.cn/embedded/96318.html

相关文章

wiota窄带通讯技术对于vu传统lora

WIoTa是一种针对广域无线物联网通信优化设计的通信协议&#xff0c;而LoRa则是一种广泛应用的低功耗广域网技术。两者在物联网领域都有广泛的应用&#xff0c;但它们在多个关键性能指标上存在显著差异。以下是从多个角度对WIoTa和LoRa进行详细对比&#xff1a; 覆盖范围 WIoTa…

Redis合集 第二章 redis客户端 第一节 jedis

jedis 线程不安全 所以每个线程需要一个独立的链接 为了保证线程安全 所以需要连接池 创建jedis链接池 public class JedisConnectionFactory {public static final JedisPool jedispool;static{//配置连接池JedisPoolConfig jedisPoolConfig new JedisPoolConfig();jedisP…

新能源汽车行业前景广阔,黄山谷捷等产业链企业迎发展良机

目前&#xff0c;我国已成为全球新能源汽车竞争的主战场&#xff0c;产销量连续9年位居世界第一。2024年上半年&#xff0c;我国新能源汽车销量同步增长32%至494.4万辆&#xff0c;市占率为35.2%。中汽协预计&#xff0c;2024年全年中国新能源汽车销量有望达到1150万辆。 随着…

从零搭建xxl-job(五):查询待执行任务逻辑优化

当前的程序还存在很多问题&#xff0c;比如每次扫描数据库都查询了所有的定时任务信息&#xff0c;那么应该查询哪些定时任务信息呢&#xff1f;怎么保证查询的定时任务准时触发&#xff1f;如果数据库中没有定时任务信息了&#xff0c;或者定时任务信息比较少了&#xff0c;sc…

人格障碍诊断系统

TOC springboot186人格障碍诊断系统 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代&#xff0c;也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端&#xff0c;也就是电脑互联网时代&#xff0c;但…

MySQL——内置函数

时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解&#xff1a; ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度&#xff0c;以字节为…

OpenCV图像滤波(19)计算图像每个像素点的邻域内的平方和函数sqrBoxFilter()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算覆盖在滤波器上的像素值的平方和。 对于源图像中的每一个像素 (x, y)&#xff0c;函数计算那些与放置在像素 (x, y) 上的滤波器重叠的邻域像…

PaddleOCR 图片文字提取

PaddleOCR 图片文字提取 需求一.裁剪车牌号码区域二.对车牌小图进行处理三.填充边界四.识别步骤 需求 工作上的一个需求&#xff0c;需要把图片中的车牌号码提取出来。如图&#xff0c;车牌在图片固定位置。开始使用pytesseract&#xff0c;对中文识别特别不友好&#xff0c;毕…