首页 > 编程语言 >排序算法-希尔排序

排序算法-希尔排序

时间:2024-12-12 19:31:19浏览次数:3  
标签:值为 算法 36 希尔 分组 增量 序列 排序

介绍

希尔排序也称缩小增量排序,属于插入排序中的一种排序算法,是在插入排序的基础上进行的改进,采用分组策略进行排序。

相关特点

  1. 时间复杂度:最好:O(n)、最坏:O(n2)、平均:O(n1.3)
  2. 辅助空间复杂度:O(1)
  3. 稳定性:不稳定

排序原理

希尔排序通过设定一个初始增量,将数组元素分组进行插入排序。随着增量的逐步减小,每组包含的元素逐渐增多,当增量减至1时,整个数组被分成一组,排序完成。

优点

  1. 效率较高‌:在初始阶段通过分组排序快速减少数据量,适合处理大规模数据。
  2. 适用于部分有序的数据‌:在数据部分有序的情况下,希尔排序的效率远高于传统的插入排序。

缺点

  1. 不稳定‌:由于多次插入排序,相同元素的相对顺序可能会被打乱,因此希尔排序是不稳定的。
  2. 增量序列的选择‌:不同的增量序列选择可能会影响算法的性能和结果,进而影响排序的效率。

应用场景

希尔排序适用于大规模数据的快速排序,特别是在数据部分有序的情况下表现优异。它常用于需要高效排序的场景,如数据库管理和大数据处理。

排序步骤

针对序列长度为偶数值的序列

以序列Array=【7 3 5 9 2 0 8 6】为例。

  1. 定义一个增量,增量的值为序列长度的一半,由此可知,序列Array的增量为8/2=4。

  2. 根据增量4进行分组,得到4组,分别是(7,2)、(3,0)、(5,8)、(9,6)

  3. 同组之间进行比较,若前面的值小于后面的值,则不发生变动,否则互换位置。最终得到如下序列

  1. 重新设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为4,则新的增量值为4/2=2。

  2. 根据步骤4得到的增量2对序列{2,0,5,6,7,3,8,9}进行分组,得到{2,5,7,8}同组,{0,6,3,9}同组。

  3. 针对步骤5中的两个同组数值进行从小到大排序,同组序列的排序结果就是{2,5,7,8},{0,3,6,9},合并起来就是

  4. 继续设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为2,则新的增量值为2/2=1(在排序过程中要一直进行分组,直到增量为1为止)。

  5. 根据步骤7得到的增量1对序列{2,0,5,3,7,6,8,9}进行分组,把8个数字看成一组,按插入排序进行排序,得到序列

针对序列长度为奇数值的序列

以序列Array=【36 27 20 60 55 7 28 36 67 44 16】为例。

  1. 定义一个增量,增量的值为序列长度的一半,序列长度为奇数时增量的值向下取整即可,由此可知,序列Array的增量为11/2=5。

  2. 根据增量5进行分组,得到5组,分别是(36,7,16)、(27,28)、(20,36)、(60,67)、(55,44)

  3. 同组之间进行比较,若前面的值小于后面的值,则不发生变动,否则互换位置。最终得到如下序列

  1. 重新设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为5,则新的增量值为5/2=2。

  2. 根据步骤4得到的增量2对序列{7,27,20,60,44,16,28,36,67,55,36}进行分组,得到{7,20,44,28,67,36}同组,{27,60,16,36,55}同组。

  3. 针对步骤5中的两个同组数值进行从小到大排序,同组序列的排序结果就是{7,20,28,36,44,67},{16,27,36,55,60},合并起来就是

  4. 继续设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为2,则新的增量值为2/2=1(在排序过程中要一直进行分组,直到增量为1为止)。

  5. 根据步骤7得到的增量1对序列{7,16,20,27,28,36,36,55,44,60,67}进行分组,把11个数字看成一组,按插入排序进行排序,得到序列

标签:值为,算法,36,希尔,分组,增量,序列,排序
From: https://www.cnblogs.com/mingcore/p/18603235

相关文章

  • 华为机试HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序
    首先看一下题描述输入整型数组和排序标识,对其元素按照升序或降序进行排序数据范围: 1≤n≤1000  ,元素大小满足 0≤val≤100000 输入描述:第一行输入数组元素个数第二行输入待排序的数组,每个数用空格隔开第三行输入一个整数0或1。0代表升序排序,1代表降序排序输出......
  • 【算法基础】图的存储与遍历
    一、图的存储在我们存储图的时候,主要使用邻接矩阵、邻接表两种方式来存储。通常邻接矩阵存储稠密图(边多),临界矩阵存储稀疏图(边少)。1.1邻接矩阵存储邻接矩阵听起来比较高大上,其实就是用二维数组来表示\(a\)点与\(b\)点之间有一条边。例如在上述无向图中\(1\)与\(4\)之......
  • 12.11实验七:K 均值聚类算法实现与测试
      一、实验目的深入理解K均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用Python语言实现K均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容 (1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测......
  • 回溯算法总结
    回溯算法总结组合问题77.组合216.组合总和III17.电话号码的字母组合39.组合总和40.组合总和II131.分割回文串93.复原IP地址78.子集90.子集II491.非递减子序列排列问题46.全排列47.全排列II组合问题77.组合回溯就是用递归枚举所有解递归函数......
  • 八皇后问题---算法
    1.“八皇后问题”描述:八皇后问题是一个经典的用回溯法来求解的问题。它要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击。故八皇后问题即:求八皇后的某种布局,使得任意两个皇后不在同一行、同一列或同一斜线上。2.算法分析:......
  • 12.10实验六:朴素贝叶斯算法实现与测试
      一、实验目的深入理解朴素贝叶斯的算法原理,能够使用Python语言实现朴素贝叶斯的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集(注意同分布取样);(2)使用训练集训练朴......
  • 什么是算法网关视频分析网关、IP-CAMERA、视频服务器与数字视频录像机?
    AI技术在安防领域的大量落地应用,深度学习方法及性能的提升,计算机视觉、图像处理、视频结构化和大数据分析等技术的完善,使得安防产品逐步走向智能化。在现代视频监控领域,随着技术的进步,我们有了多种设备和技术来满足不同的监控需求。这些技术包括IP-CAMERA、视频服务器和数字视频......
  • 12.9实验五:BP 神经网络算法实现与测试
    实验五:BP神经网络算法实现与测试 一、实验目的深入理解BP神经网络的算法原理,能够使用Python语言实现BP神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集......
  • 【推荐算法】单目标精排模型——Wide & Deep
    keyword:Google应用商店Motivation:作者认为一个好的推荐模型需要包含memorization和generalization。memorization主要负责记忆法频繁出现的特征项;generalization主要负责挖掘新的特征组合;截至2016年,作者认为目前的基于神经网络的推荐模型会过度泛化并推荐相关性较低的物品(ge......
  • 转载:【AI系统】内存分配算法
    本文将介绍AI编译器前端优化部分的内存分配相关内容。在AI编译器的前端优化中,内存分配是指基于计算图进行分析和内存的管理,而实际上内存分配的实际执行是在AI编译器的后端部分完成的。本文将包括三部分内容,分别介绍模型和硬件的内存演进,内存的划分与复用好处,节省内存的算法......