算法 —— 希尔排序

希尔排序算法 1.简介 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序; 2.希尔排序的基本思想 1>.希尔排序是把原始元素序列按下标的一定增量(/步长)分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个元素序列恰被分成一组,再进行最... 阅读详情
     希尔排序是插入排序的进一步的展示方式。
      1、原理:希尔排序将所有的元素分为若干个子序列,在这些子序列内部进行直接插入排序,然后再将子序列的内部元素数量减小,等到所有的待排元素的基本有序时,再将全体元素进行一次直接插入排序。
       简单举例
          现在我们有需要待排的10个数字,分别为:10,25,3,54,56,1,46,74,79,32。步长 为 10 / 2 = 5,即:
     10 ,25,  3,54,56
     1   ,46,74,79,32
然后对每组进行排序
为
1 ,25,   3,54,32
10,46,74,79,56

这样,我们得到的序列为:1,25,3,54,32,10,46,74,79,56,这时,1已经在正确的位置了。然后再以5/2 = 2为步长进行排序
  1,25,
  3,54,
32,10,
46,74,
79,56
再对每列进行排序,为:
  1,10,
  3,25,
32,54,
46,56,
79,74
这时我们得到的数据排序为:1,10,3,25,32,54,46,56,79,74
此时,步长为 2 / 2 = 1,对所有的数据进行直接插入排序

总结: 每次选定一个步长,对数组进行划分,然后对每小列当中的数据进行直接插入算法排序,得到新的序列,然后再选择步长分组,再次小组内数据插入排序,直到步长变为1,在进行一次直接插入排序。

     2、步长选择
          已知最好的步长串行 算式为:9 * 4^i - 9 * 2^i + 1 和 4^i - 3 * 2^i + 1,在希尔排序中“比较在希尔排序中是最主要的操作,而不是交换”
          在实践中,如果没有特殊需要,一般规则为:
           第一次取总长度的一般,第二次取一半的一半,依次累推直到步长为1.

3、代码:
        NSInteger i , j , k ,gap;
   
   
for (gap = n / 2; gap > 0; gap /= 2) {
       
for (i = 0; i < gap; i ++) {
           
for (j = i + gap; j < n; j += gap) {
               
if (arr[j] < arr[j - gap]) {
                   
int temp = arr[j];
                    k = j - gap;
                   
while (k >= 0 && arr[k] > temp) {
                        arr[k + gap] = arr[k];
                        k -= gap;
                    }
                    arr[k + gap] = temp;
                }
            }
        }
    }

4、优化
     根据直接插入算法当中的描述,如果arr[i]> arr[i -1],那么i 之前的数据则都是有序的,也就无需在进行插入排列。否则,另j = i-1,temp = arr[i],然后再将数据进行后移操作,直到 arr[j]< arr[i]停止操作,将temp 放到arr[j + 1]位置上。
    NSInteger i,k ,gap;
   
for (gap = n / 2; gap > 0; gap /= 2)
    {
       
for (i = gap; i < n; i ++)
        {
           
if (arr[i] < arr[i - gap])
            {
               
int temp = arr[i];
                k = i - gap;
               
while (k >= 0 && arr[k] > temp) {
                    arr[k + gap] = arr[k];
                    k -= gap;
                }
                arr[k + gap] = temp;
            }
        }
    }
手把手教你用野火FPGA开发板资料包安装ModelSim 10.5se(附破解教程) 本文提供了一份详细的指南,手把手教你为野火FPGA开发板安装和配置ModelSim 10.5se仿真工具。内容涵盖从前期准备、软件安装、许可证激活(学习用途)到环境验证的全过程,并简要介绍了如何与Xilinx Vivado开发套件集成,帮助初学者快速搭建稳定的FPGA仿真环境。 阅读详情

相关推荐

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

实现希尔排序算法

/** *    实验题目: *        实现希尔排序算法 *    实验目的: *        领会希尔排序的过程和算法设计 *    实验内容: *        设计程序,实现希尔排序算法。用相关数据进行测试,并 *    输出各趟的排序结果。 *    基本思想: *       希尔排序是针对直接插入排序算法的改进,该方法又称缩小增量排序。 *    先取一个小于n的整数d1作为...

xiezhi123456的博客 2066

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2726

排序算法之希尔排序

希尔排序 1959年由唐纳德·希尔(Donald Shell)提出希尔排序。 希尔排序的思想:把数组中的元素看作是一个矩阵,分成m列,逐列进行排序(一般采用插入排序),m从某个整数逐渐减为1,当m为1时,整个序列将完全有序。因此,希尔排序也被称为递减增量排序(Diminishing Increment Sort)。 矩阵的列数取决于步长序列(step sequence),比如,如果步长序列为{1,5,19,41,109,…},就代表依次分成109列、41列、19列、5列、1列进行排序。不同的步长序列,执行效

morris 3万+

达梦数据库与sharding-jdbc的深度适配实践

本文详细介绍了达梦数据库与sharding-jdbc的深度适配实践,包括驱动与依赖管理、核心适配实现、注册与配置等关键步骤。通过扩展shardingSphere的方式,成功实现了达梦数据库的分库分表功能,并提供了常见问题解决方案和性能优化建议,助力企业级应用高效处理海量数据。

weixin_30300225的博客 623

全球最大光伏电池缺陷异常检测数据集PVELAD【发布】

下载地址 1:GitHub - binyisu/PVEL-AD 下载地址 2:http://aihebut.com/col.jsp?id=118 下载地址 3:NAVEDownload 竞赛测试系统:Photovoltaic cell anomaly detection | Kaggle 一、简介 PVEL-AD 数据集又叫做EL2021数据集是用于对光伏电池异常缺陷检测方法进行基准测试的数据集,重点是光伏电池工业检测。PVEL-AD包含 36,543 张具有各种内部缺陷和异构背...

苏打水的杯子的博客 2万+

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

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

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

30天入门Python(办公篇)——第34天:pandas - 数据处理与分析利器

摘要 本文介绍了Python数据分析库pandas的核心功能,包括数据结构和基本操作。主要内容涵盖:1) Series和DataFrame两种核心数据结构的创建与使用;2) 多种文件格式的读写方法;3) 数据查看、筛选和清洗技巧;4) 基础统计分析功能;5) 数据透视表和交叉表制作;6) 数据排序与合并等变换操作。文章通过大量代码示例演示了pandas在数据处理各环节的应用,适合作为pandas入门的实践指南,帮助读者快速掌握这一强大工具的基本使用方法。

weixin_42636075的博客 300

排序算法——希尔排序算法详解

在计算机科学领域中,数据排序是一项基础而重要的任务。通过对数据进行排序,可以更有效地进行搜索、查找和分析。在处理大规模数据集时,高效的排序算法对于提高程序性能至关重要。希尔排序,又称为“缩小增量排序”,是插入排序的一种改进版本。它通过比较相隔一定间隔的元素,交换不相邻的元素,以在每一轮中逐步将未排序的序列变得有序。希尔排序的核心思想是通过逐渐减小元素之间的间隔,使得序列在初始阶段就呈现局部有序,从而减少插入排序的工作量。

qq_19774249的博客 3616

3、提升管壳式换热器能效:双螺旋盘管的应用研究

本研究探讨了在管壳式热交换器中应用双螺旋盘管以提升能效的可行性。通过实验对比双螺旋与单螺旋盘管的热传递效率,结果显示双螺旋盘管达到54.33%的效率,显著优于单螺旋的48.88%。双螺旋结构不仅增大了换热面积,还因产生剪切应力而减少结垢,延长运行周期。采用NTU方法评估热传递性能,验证了该设计在工业应用中的高效性与实用性,建议在制冷、空调、石油精炼等领域推广使用。

k8s6orchestrator的博客 106

《备考系统分析师》 - 专栏介绍和目录

本专栏提供软考高级系统分析师全套备考资料,包含四大核心内容:1.详细考点梳理(覆盖基础知识、关键技术、案例实践三大模块16个章节);2.历年真题及解析(2009-2022年所有真题含综合知识、案例分析和论文);3.100+篇高质量论文范文;4.预测模拟题。早鸟价仅需9.9元,可节约80%资料搜集时间,帮助考生高效备考、顺利通过考试。专栏持续更新,有问题可随时联系作者。

数据知道的博客 1万+

十大经典排序算法-希尔排序算法详解

一、什么是希尔排序 1.概念 希尔排序(Shell Sort)是把记录按下标的一定增量分组,对每组使用插入排序算法,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止 2.算法原理 这是一个无序数列:1、5、8、4、7、2、6、3,我们要将它按从小到大排序。按照希尔排序的思想,我们先把数列进行分组排序 首先,我们选择序列长度的一半4,作为增量进行分组 如果所示,1和7一组,5和2一组,8和6一组,4和3一组,共四组 然后,我们对每一组进行插入排序,排序后序列如下 经

qq_35344198的博客 1万+

Codex 100个真实案例 - 全系列总结与Codex最佳实践全解析

历经100个案例的淬炼,我们终于来到了终点!本篇是整个系列的压轴之作——全面回顾100个案例的分类统计、提炼Codex使用的核心技巧和最佳实践、总结Prompt工程的精华要点、剖析常见错误及解决方案、展望AI编程的未来趋势,并为不同水平的读者规划学习路径。这不仅是一篇总结,更是一本Codex实战手册!

yueyeguzhuo的专栏 135

希尔排序是一种稳定的排序算法_【算法】排序算法之希尔排序

一、排序算法系列目录说明冒泡排序(Bubble Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)选择排序(Selection Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort)计数排序(Counting Sort)桶排序(Bucket Sort)基数排序(Radix Sort)二、希尔排序(Shell Sort)...

weixin_39925031的博客 1350

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

算法——希尔排序

希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的数组分割成若干个子序列,对子序列进行排序,然后逐步合并这些子序列,最终得到一个有序的数组。希尔排序的特点是可以通过设置不同的增量序列来改变算法的效率,通常选择的增量序列是经过优化的递减数列。希尔排序的时间复杂度取决于增量序列的选择,通常为O(n log n)到O(n^2)之间。这种排序算法由Donald Shell于1959年提出并命名。

m0_74774362的博客 1413

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

希尔排序 算法

算法思路 插入排序的改进版,选择插入距离远的元素 选择一个间距,将序列分成很多子序列并行插入排序 降低间距,并重复插入元素,直到间距将为1,完成排序。 算法实现 void shell_sort(vector<int> &arr, int beg, int gap) {//gap为1时即直接插入排序 for (int i = beg + gap; i< arr.siz...

天行健,地势坤 495

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

排序算法——希尔排序

希尔排序是直接插入排序改进后更高效的一个版本,也称为缩小增量排序。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插...

数据联盟 2386

希尔排序的算法实现

1 问题在不使用python内置的排序函数的情况下,如何对一个序列按照从小到大的顺序进行排序?2 方法希尔排序(Shell Sort)是一种基于插入排序的排序算法,也被称为“缩小增量排序”(Diminishing Increment Sort)。其主要思想是通过将原序列划分成多个小组,并对每个小组进行插入排序,最终再对整个序列进行一次插入排序。具体实现过程如下:选择一个增量序列 d1、d2、……、...

算法与编程之美 1375

排序算法:希尔排序算法思想及实现示例

冒泡排序算法、选择排序算法和插入排序算法,虽然思路简单,但是排序效率比较低。对于大量得数据需要排序时,往往需要其他更高效的排序算法。希尔排序算法便是其中一种。 希尔排序算法 希尔排序基于插入排序的思想,又称为缩小增量排序。希尔排序算法的排序流程如下: (1)将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2 + 1个数据为一对,…… (2)一次循环使每一个序列对排行顺序。 (3...

10 DAY'S 643

排序算法之 Java希尔排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class Shell { ...

alex00112233的博客 111
上一篇: 算法——插入排序
下一篇: 算法 —— 归并排序
For_SHINee
博客等级 码龄16年 0粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值