经典算法(四)---希尔排序

排序算法图解(四):希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称缩小增量排序。希尔排序是非稳定排序算法。把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。 阅读详情

一、希尔排序

1. 希尔排序的定义

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法(接下的例子会说明)。该方法因 D.L.Shell 于 1959 年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;

比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。

随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

2. 算法思想:

希尔排序又称“分组插入排序”,先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量为1后)时,再对全体元素进行一次直接插入排序。

动态图如下:

注意:动态图中的gap为上面所说的 “增量”,为数组长度len除以2,每排序后一次除以2,直至gap=1。

动态图(2)如下:

接下来看一个例子:

第一步:将数组元素个数分为 nic = len/2 组,以这个例子为例分为10/2=5组(第一次的增量为5),就如下的9-4, 1-8, 2-6, 5-3, 7-5分为五种颜色。

第二步:比较大小,使用key来储存转换元素的值,相当于转换酱油和可乐的第三个空瓶子,

当第二个值 比 对比的前一个值小,就交换它们的值,(这里使用交换是不恰当的,交换是用在相邻的元素,但这样更便于理解)例如:9 - 4,4比9小,4就插入9的位置,9插入4的位置。

  1. gap = 10 / 2 = 5,第一趟排序,分为五组比较排序(流程图五种颜色显示):9 - 4, 1 - 8,  2 - 6,  5 - 3, 7 - 5, 一组一组的比较比较之后为4 - 1 - 2 - 3 - 5 - 9 - 8 - 6 - 5 - 7
  2. gap = 5 / 2 = 2,    第二趟排序,比较的组变为4 - 2 - 5 - 8 - 5  和  1 - 3 - 9 - 6 -7
  3. 比较循序为:2 - 4比较后转换为2 - 4,1 - 3 比较后还是1 - 3,接着4 - 5比较还是4 - 5,(事实上是对比一次红色组然后对比一次蓝色组这样对比下去)5 - 8比较后变为8 - 5,8 - 5比较后变为5 - 8,第一组增量就变为了:2 - 4 - 5 - 5 - 8,第二组为:1 - 3 - 6 - 7 - 9 
  4. 就这样继续完成第二趟排序后数组为: 2 - 1 - 4 - 3 - 5 - 6 - 5 - 7 - 8 - 9 
  5. gap = 2 / 2 = 1,增量减至 1 时,整个文件恰被分成一组(第三趟全为红色),熟悉的直接插入排序就来了,gap = 1第三趟排序结束,排序也就结束了经典算法(三)---插入排序icon-default.png?t=N7T8https://blog.youkuaiyun.com/code__01/article/details/134746531?spm=1001.2014.3001.5502

非稳定排序算法:

有下划线的 5 为后面的5,没有下划线的 5 为前面的5,但排序结束后,后面的 5  却排在了前面的 5 前面

程序流程图如下:

代码参考:

#include<stdio.h>
//复制函数:打印数组
void print_arr(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 希尔排序
void shell_sort(int arr[], int len)
{
    int i, j, inc, key;
    // 初始inc增量:len/2,每一趟之后除以二
    for (inc = len / 2; inc > 0; inc /= 2)
    {
        // 每一趟采用插入排序
        for (i = inc; i < len; i++)
        {
            key = arr[i];
            for (j = i; j >= inc && key < arr[j - inc]; j -= inc)
                arr[j] = arr[j - inc];
            arr[j] = key;
        }
        print_arr(arr, len);
    }
}

int main(int argc, char const* argv[])
{
    int arr[] = { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5};
    int len = 10;//要排序的数组元素个数

    print_arr(arr, len);

    shell_sort(arr, len);

    return 0;
}

Java经典算法之希尔排序 希尔排序(Shell Sort)是一种基于插入排序的改进算法,由Donald Shell在1959年提出。它通过定义一个序列的间隔序列来对原始数据进行分组,并对每个组使用插入排序,随着间隔序列的减小,最终使得整个数组接近有序,然后再执行一次增量为1的插入排序,从而达到整体有序的效果。 阅读详情

相关推荐

一文学懂经典算法系列之:希尔排序

本文关键字:经典算法、排序算法、插入排序、希尔排序、算法实践。希尔排序可以看做是分组插入的排序方法,把全部元素分成几组(等距元素分到一组),在每一组内进行直接插入排序。然后继续减少间距,形成新的分组,进行排序,直到间距为1时停止。...

微光点亮星辰 9083

排序算法 —— 希尔排序(图文超详细)

java 实现希尔排序

超烦豆先森 11万+

数据结构希尔排序

数据结构 内排序の希尔排序。VC6.0调试通过.

常见的排序算法(插入、希尔、选择、堆、冒泡、快排、归并)

直接插入排序希尔排序选择排序堆排序冒泡排序快速排序归并排序。

2301_81324046的博客 3726

直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序

直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序的C++语言实现,亲测可行,二路归并排序未得到预期结果,望指正。

快速排序、归并排序、希尔排序、冒泡排序、选择排序等8中排序方式原理分析java实现

快速排序、归并排序、希尔排序、冒泡排序、选择排序、插入排序等8中排序方式原理分析java实现

C语言(数据结构)+希尔排序的实现,详细流程讲解+代码实现+适用场景

希尔排序是直接插入排序的一种优化,可以用于数据量比较大的数组排序,,从上面的时间复杂度可以分析得出,越是大的数组,越能体现出希尔排序的高效

qq_63713328的博客 1507

实测对比:DJI O3、Walksnail Avatar、HDZero三大高清图传,谁才是低延迟王者?

本文对DJI O3、Walksnail Avatar V2和HDZero三大高清图传系统进行了实测对比,重点分析其在FPV飞行中的低延迟表现。通过专业测试环境和量化数据,揭示HDZero在原生低延迟架构上的优势,DJI O3在画质与延迟间的平衡,以及Walksnail的动态码率调整特点,为不同场景下的选购提供决策依据。

weixin_30756499的博客 444

图解希尔排序——希尔排序算法(shell sort)

经典排序算法之希尔排序:希尔排序又叫缩小增量排序,它是对直接插入排序算法的一种改进。希尔排序算法的基本思想是先将整个待排序的序列划分为若干个子序列,然后分别对子序列排序,逐步缩小划分子序列的间隔,直到划分间隔为1时排序完成。............

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 4410

CMOS sensor 基础

NA

m0_72053187的博客 1657

浮点数运算的陷阱与启示:FP16加法器/乘法器开发中的常见误区

本文深入探讨FP16加法器和乘法器开发中的常见误区,包括FP16格式解析、阶码对齐陷阱、尾数运算风险及规格化处理。通过Verilog实战代码展示防御性编程技巧,帮助开发者避免边界条件处理和异常状态管理中的错误,提升硬件设计的可靠性和效率。

dell8的博客 249

经典算法之四:希尔排序的实现

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。   该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因

AC_Dreameng 940

WSL2部署Cadence Virtuoso IC25.1:Ubuntu 26.04排障实录

WSL2以轻量虚拟机结合完整Linux内核,为Windows桌面环境提供了原生级Linux运行能力,解决了传统虚拟机资源开销大、双系统切换低效的问题。对于依赖X11图形协议、FlexNet许可服务和特定动态库的EDA工具链而言,利用WSL2部署Linux发行版需要关注系统集成、显示通路与许可连通性。从技术原理看,图形层X Server的配置、动态库依赖的补齐以及license服务的主机名解析,共同构成EDA工具在WSL2中稳定运行的关键环节。在芯片设计场景中,设计工程师常需在Windows办公机与Linux

weixin_29597551的博客 208

经典算法(四)----希尔排序----图解法让你快速入门

引言 只要设计到数据,就会涉及到数据的排序问题,比如给你随机给你五个整数3,1,5,2,4 。让你从小到大进行排序,那我们该怎样才是实现对这些整数的排序呢 ? 答案是多种多样的,比如用插入排序、希尔排序、堆排序、归并排序、快速排序等等,这些排序方法都可以实现对整数排序,而这篇文章要讲的就是希尔排序 本文将从以下几个问题对希尔排序进行分析和讲解: 什么是希尔排序? 希尔排序的大概过程是什么? 怎样用代码实现希尔排序? 希尔排序的代码详解。 什么是插入排序? ...

好好学习。天天编程 1914

092、多sensor帧同步在环视系统中的实现——基于瑞芯微RK3588的PPS同步与曝光同步方案

摘要: 本文探讨了瑞芯微RK3588平台在360环视系统中实现多摄像头帧同步的技术方案。针对环视拼接常见的动态场景错位问题,提出了PPS同步与曝光同步相结合的解决方案。通过GPIO硬件触发实现四路摄像头同步曝光,配合I2C全局曝光控制,将时间误差控制在0.5ms内。文章详细解析了RK3588设备树配置、内核驱动实现中的关键细节,包括同步信号处理、寄存器原子写入等核心技术点,并分享了量产中遇到的温度漂移、信号完整性等实际问题及解决方法。最终通过硬件整形和电源优化,将同步抖动控制在±5μs以内,有效解决了动态拼

zzfmlxs的博客 33

华为面试手撕真题【最长不重复子串】

给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

MISAYAONE的博客 1万+

经典算法之希尔排序

C++经典算法之希尔排序

weixin_68153081的博客 494

23种设计模式-代理(Proxy)设计模式

软考中级-软件设计师 代理设计模式

片言可决讼,半纸能缚龙 1781

白话经典算法系列之三 希尔排序的实现

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。   该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增

MoreWindows Blog 22万+

飞塔CVE-2022-40684复现

admin 无密码直接回车(会提示修改密码)

G3et的博客 1144

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python经典算法大全,python经典算法题

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。工作原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。选择排序是不稳定的排序方法。如果我们正在查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。

Night368的博客 1657

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构经典算法之希尔排序

目录 希尔排序 一、操作方法 二、排序方法: 三、动图演示 四、C#实现代码 五、性能分析: 希尔排序 希尔排序又称“缩小增量排序”。基本思想:先取一个小于n的整数d1作为第一个增量,然后把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同个一个组中,现在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组中的分组和排序,直到所取的增量dt=(d...

似水流年,是谁苍白了等待 820

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

经典算法之希尔排序(Shell Sort)

希尔排序时插入排序的一种,也称缩小增量排序,是直接插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

阿莫夕林的博客 953

经典算法 之 希尔排序 python实现

本文介绍了排序算法中希尔排序的基本原理,讨论了其算法复杂度,并给出了Python实现。

FFTang的博客 885

C语言经典算法之希尔排序算法

希尔排序(Shell Sort)是一种插入排序的改进版本,其核心思想是通过逐步缩小数组的间隔,对子序列进行插入排序,最终实现对整个数组的排序。

weixin_56154577的博客 1939
上一篇: 经典算法(三)---插入排序
下一篇: 经典算法(五)---归并排序
'撒野奔跑.
博客等级 码龄4年 185粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'撒野奔跑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值