【排序算法】希尔排序详解!(源码+实现)

这篇具有很好参考价值的文章主要介绍了【排序算法】希尔排序详解!(源码+实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【排序算法】希尔排序详解!(源码+实现),# 排序篇,算法,排序算法,c语言,开发语言,数据结构

🎥 屿小夏 : 个人主页
🔥个人专栏 : 算法—排序篇
🌄 莫道桑榆晚,为霞尚满天!

📑前言

什么是希尔排序?希尔排序是如何实现的?它的思想和由来又是什么?
本文将从多方面,精细的带你了解希尔排序,让你彻底掌握它!

🌤️希尔排序

☁️希尔排序的由来

希尔排序(Shell Sort)是一种排序算法,由美国计算机科学家Donald Shell于1959年提出。希尔排序是插入排序的一种改进版本,旨在减少插入排序的交换操作和比较次数,从而提高排序效率。这个算法的名字是以发明者的名字命名的,虽然它也被称为“递减增量排序”。

☁️希尔排序的思想

希尔排序的关键思想是将待排序的元素分为多个子序列,然后对每个子序列进行插入排序。这些子序列是原始序列中相隔一定增量的元素组成的。然后逐渐减小增量,重复这个过程,最终将增量减小到1,完成最后一轮的插入排序,此时序列已经基本有序,只需进行少量的比较和交换操作,大大提高了排序效率。(上图展示更直观)

【排序算法】希尔排序详解!(源码+实现),# 排序篇,算法,排序算法,c语言,开发语言,数据结构

☁️希尔排序代码实现

//希尔排序(便于理解版)
void ShellSort1(int* a, int n)
{
    int gap = n;
    while (gap > 1)
    {
        //gap /= 2;
        gap = gap / 3 + 1;
        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 (tmp < a[end])
                    {
                        a[end + gap] = a[end];
                        end -= gap;
                    }
                    else
                    {
                        break;
                    }
                }
                a[end + gap] = tmp;
            }
        }
    }
}
//希尔排序(少一层循环版)
void ShellSort2(int* a, int n)
{
    int gap = n;
    while (gap > 1)
    {
        //gap /= 2;
        gap = gap / 3 + 1;
        for (int i = 0; i < n - gap; i++)
        {
            int end = i;
            int tmp = a[end + gap];
            while (end >= 0)
            {
                if (tmp < a[end])
                {
                    a[end + gap] = a[end];
                    end -= gap;
                }
                else
                    break;
            }
            a[end + gap] = tmp;
        }
    }
}

☁️代码解析

⭐ShellSort1

这是一个较为直观的实现方式,它使用了两层循环。外层循环控制间隔gap的大小,初始时将gap设为数组长度n。在每次循环中,通过将gap除以3并加1的方式来缩小间隔gap的值。内层循环用于遍历每个间隔为gap的子序列,并进行插入排序。步骤如下:

  1. 初始化间隔gap为数组长度n。
  2. 当gap大于1时,进行以下操作:
    • 将gap除以3并加1,更新gap的值。
    • 对于每个间隔为gap的子序列,进行插入排序。
      • 从子序列的第一个元素开始,逐个向后遍历子序列中的元素。
      • 对于当前遍历到的元素,将其与之前的元素进行比较。如果比之前的元素小,则将之前的元素后移gap个位置。
      • 重复上述步骤,直到找到合适的位置插入当前元素。
  3. 缩小间隔gap的值。
  4. 重复步骤2和3,直到gap为1。

⭐ShellSort2

这是对ShellSort1函数的一种优化,它减少了一层循环。具体实现如下:

  1. 初始化间隔gap为数组长度n。
  2. 当gap大于1时,进行以下操作:
    • 将gap除以3并加1,更新gap的值。
    • 对于每个间隔为gap的子序列,进行插入排序。
      • 从子序列的第一个元素开始,逐个向后遍历子序列中的元素。
      • 对于当前遍历到的元素,将其与之前的元素进行比较。如果比之前的元素小,则将之前的元素后移gap个位置。
      • 重复上述步骤,直到找到合适的位置插入当前元素。
  3. 缩小间隔gap的值。
  4. 重复步骤2和3,直到gap为1。

☁️希尔排序特性总结

  1. 希尔排序是对直接插入排序的优化。

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

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

  4. 希尔排序的时间复杂度都不固定:【排序算法】希尔排序详解!(源码+实现),# 排序篇,算法,排序算法,c语言,开发语言,数据结构【排序算法】希尔排序详解!(源码+实现),# 排序篇,算法,排序算法,c语言,开发语言,数据结构

🌤️全篇总结

经过对希尔排序的由来,思想以及希尔排序是如何实现的,并且对希尔的特性进行了总结。

☁️ 好了,由于篇幅有限,本章专对希尔排序进行了详细的讲解,后序会出更多的排序算法哦!
看到这里了还不给博主留个:👍 点赞🌟收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
【排序算法】希尔排序详解!(源码+实现),# 排序篇,算法,排序算法,c语言,开发语言,数据结构文章来源地址https://www.toymoban.com/news/detail-743796.html

到了这里,关于【排序算法】希尔排序详解!(源码+实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【排序篇1】插入排序、希尔排序

    思路: 插入排序就像玩扑克牌,抽出一张牌作为比较的元素,与前面的牌依次进行比较,小于继续往前比较,大于等于停下插入到当前位置。 图示: 注意:总共的排序次数是n-1趟,即end最多只能到倒数第二个元素,因为如果end为最后一个元素,那么end+1的位置就是越界的。

    2024年01月17日
    浏览(37)
  • 【数据结构】—从直接插入排序升级到希尔排序究极详解(含C语言实现)

                                            食用指南:本文在有C基础的情况下食用更佳                                          🔥 这就不得不推荐此专栏了: C语言                                         ♈️ 今日夜电波:透明で透き通って何にでもなれそ

    2024年02月08日
    浏览(49)
  • 【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】

    目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的七大排序 2.直接插入排序 2.1基本思想 2.2直接插入排序 2.3动图助解 2.4直接插入排序源码 2.5直接插入排序的特性总结 3.希尔排序( 缩小增量排序 ) 3.1希尔排序概念及思想 3.2希尔排序图解 3.3希尔排序源码 3.4希尔排序

    2024年02月13日
    浏览(50)
  • 排序算法——希尔排序图文详解

    注1:本篇是基于对直接插入排序法的拓展,如果对直接插入法不了解,建议先看看 直接插入排序 注2:本篇统一采用升序排序 希尔排序法又称缩小增量法。 希尔排序其实是直接插入排序的改进。 其 基本思想是 : 先选定一个整数gap,把待排序文件中所有记录分成数组,所有

    2024年02月07日
    浏览(35)
  • C语言经典算法之希尔排序算法

    目录 前言 一、代码实现 二、算法的时空复杂度 时间复杂度: 空间复杂度: 建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。            2.建议读者学习算法的时候,自己手动一步一步地运行算法。 tips:本算法是在直接排序算法的基础上拓展而来的,

    2024年01月18日
    浏览(45)
  • C语言希尔排序详解!!!速过

    目录 希尔排序是什么? 关于时间复杂度 希尔排序的源代码 希尔排序源代码的详解 之前我们说了三个排序(插入排序,选择排序,冒泡排序)有需要的铁铁可以去看看之前的讲解。 但因为之前的排序时间复杂度都是n^2.接下来介绍的希尔排序是一个时间优于前面三种排序的算

    2024年02月20日
    浏览(22)
  • 排序篇:归并排序的递归,非递归以及计数排序的实现(C语言)

    目录 一:归并排序 (1)归并排序的基本思想 (2)递归版本 ①实现思路 ②合并 ③递归实现有序 ④最终代码 (3)非递归版本 ①实现思路 ②控制分组 ③最终代码 (4)时间,空间复杂度分析 (5)小结 二:计数排序 (1)计数排序的基本思想 (2)实现思路 (3)图解加最终代码 (4)时间,空间复杂

    2024年02月04日
    浏览(65)
  • 插入排序和希尔排序:用C语言打造高效的排序算法

    插入排序的思路就像是你在整理一堆扑克牌。你先拿起第一张牌,然后拿起第二张牌,把它插入到合适的位置,使得你手上的两张牌是有序的。接着,你再拿起第三张牌,也把它插入到合适的位置,使得你手上的三张牌是有序的。依此类推,直到你把所有的牌都拿到手上,这

    2024年02月16日
    浏览(36)
  • 【五一创作】排序篇:冒泡排序,快速排序的递归与非递归实现(C语言)

    目录 前言: 一:冒泡排序 基础思路 完整排序 时间复杂度分析 二:递归实现快速排序 基础思路 单趟排序 (1)双向扫描法 (2)挖坑法 (3)前后指针法(推荐这种) 完整排序 时间复杂度分析 优化 (1)三数取中 (2)小区间优化(递归的完整代码在这里!!!) 三:非递归实现快速排序 基础

    2024年02月04日
    浏览(37)
  • 快速了解四种排序算法:希尔排序,堆排序,快速排序,冒泡排序(c语言)

     一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。 1.1算法(algorithm ) 是指令的集合,是为解决特定问题而规定的一系列操作。 它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包