码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【数据结构--八大排序】之希尔排序


    在这里插入图片描述

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
    📃个人主页 :阿然成长日记 👈点击可跳转
    📆 个人专栏: 🔹数据结构与算法🔹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步:i=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;
    		}
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    六、测试结果

    在这里插入图片描述

    七、 时间复杂度

    在这里插入图片描述

  • 相关阅读:
    ArcGIS制图:高考人数统计
    电子学会2022年6月青少年软件编程(图形化)等级考试试卷(三级)答案解析
    数学建模—模糊综合评价模型
    Java给图片增加水印,根据图片大小自适应,右下角/斜角/平铺
    华为云云耀云服务器L实例评测|Docker版的Minio安装 & Springboot项目中的使用 & 结合vue进行图片的存取
    你真的会开发测试框架?
    [附源码]java毕业设计基于JAVAWEB医院挂号系统
    MySQL_01_概述
    智能合约漏洞,价值 50 万美元 BNO 攻击事件原理分析
    程序员常用的25个技术网站,良心推荐!
  • 原文地址:https://blog.csdn.net/luhaoran814/article/details/133515138
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号