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

排序算法——希尔排序 Shell Sort(C++ Java) 希尔排序(ShellSort)也称递减增量排序算法,其实它是插入排序的优化版本。希尔排序是非稳定排序算法。 希尔排序对插入排序的以下两点进行改进: (1)插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; (2)一般来说插入排序是低效的,因为插入排序每次只能将数据移动一位。 原始的算法实现在最坏的情况下需要进行O(n^2)的比较和交换。V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(n(logn)^2)。这比最好的比较算法的O(nlogn)要差一些。 希.. 阅读详情

简介

1959年由Shell发明,是第一个突破O(n2)的排序算法,是简单插入排序的改进版。

它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。

希尔排序中对于增量序列的选择十分重要,直接影响到希尔排序的性能。一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n^3/2)。

排序过程

请添加图片描述

实现

/**
     * 希尔排序
     *
     * @param arr n
     * @return
*/
public static int[] sort(int[] arr) {
    int n = arr.length;
    int gap = n;
    while ((gap /= 2) != 0) {
        for (int i = 0; i + gap < n; i++) {
            int tmp = i;
            while (tmp != -1 && arr[tmp] < arr[tmp + gap]) {
                exchangeArrayEle(arr, tmp, tmp + gap);
                tmp -= 1;
            }
        }
    }
    return arr;
}

/**
     * 交换数组元素
     * 临时变量法
     *
     * @param nums 数组
     * @param i 待交换元素i
     * @param j 待交换元素j
 */
public static void exchangeArrayEle(int[] nums, int i, int j) {
    Assert.assertNotNull(nums);
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}
复杂度
O(n^3/2)
Shell排序时间复杂度实验研究 (2005年) 为探索具有最优渐近时间复杂度的步长序列及其选择方法,以不同步长序列对一些规模较大的待排序列进行试验,研究了Shell排序的时间复杂度与步长序列的关系。 立即下载

相关推荐

AlphaPose复现配置教程

AlphaPose是一种准确的多人姿态估计器,这是第一个在COCO数据集上达到70+ mAP (75 mAP)和在MPII数据集上达到80+ mAP (82.1 mAP)的开源系统。为了匹配跨帧的同一人的姿态,我们还提供了一种高效的在线姿态跟踪器,称为Pose Flow。这是第一个在PoseTrack挑战数据集上达到60+ mAP (66.5 mAP)和50+ MOTA (58.3 MOTA)的开源在线姿态跟踪器。AlphaPose支持Linux和Windows操作系统!指路👉。

m0_56661101的博客 4527

排序算法 | 希尔shell排序,算法的图解、实现、复杂度和稳定性分析

1、希尔排序——定义 希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由希尔 1959 年公布。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 2、希尔排序——步骤描述 3、希尔排序——算法实现 4、希尔排序——复杂度、稳定性分析 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序, 但在不同的插入排

比特的一天 4825

NRF52832调试方法1——HardFault_Handler问题定位

一、遇到问题 keil debug模式下,直接点击全速运行(Run)发现程序卡死,点击stop按钮后,停到了HardFault_Handler位置,如下图所示。 此时使用navigate backwards(蓝色左箭头)是无效的,找不到程序卡在哪里。 二、解决办法 此时首先观察register窗口 若Stack为MSP,则复制R13(SP)的值到memory观察窗的地址搜索栏。每一行显示连续的28个地址上的存储信息,每个地址上存有一个字节。 从第21个位置起的连续四个字节是LR的值,

小梁的博客 3650

插入排序和shell排序及其时间复杂度和空间复杂度分析

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序。 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后

6387

Verilog单周期CPU设计(超详细)

实验 单周期CPU一、设计目的与目标实验内容实验要求二、课程设计器材硬件平台软件平台三、 CPU逻辑设计总体方案指令模块MIPS指令格式指令处理流程数据通路总体结构图设计流程逻辑图四、模块详细设计PCAdd4PCINSTMEMDATAMEMSHIFTER32_L2SHIFTER_COMBINATIONMUX4X32MUX2X5EXT16T32MUX2X32CONUNITREGFILEALUSing...

Ace Cheney的博客 9万+

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器: 二、由两个半加器构成的1-bit全加器: ..

zep 1万+

shell排序基本思想及其复杂度分析

/* * shell排序(希尔排序) * 基本思想:希尔排序选取一个增量h,也就是把整个数组分成h份,对每一份进行排序。 * 然后减少增量h,重复上述过程。 * 一般我们选取的递增序列为:3*h+1   即1,4,13,40,..... * 实现:用一个while语句求出对应数组我们所需要的最大h * 然后在用一个外层while循环控制h,每循环一次h=h/3;直至h自减至1; * 内层是直接插入...

w535921917的博客 1823

【TC3xx芯片】TC3xx芯片PFlash的ECC校验问题补充

TC3xx芯片PFlash的ECC校验问题补充

qq_36056498的博客 1153

Shell常见的排序和查找算法

详细的对常见的排序和查找算法进行了解释说明,对冒泡排序、插入排序、选择排序、顺序查找、二分查找依次进行了解释和shell的代码实现。

settng style 1482

基石篇:多模态数据工程导论与核心概念

多模态数据工程不是写Python脚本处理几张图片,而是设计并构建一套系统,来规模化地生产高质量、可追溯、符合合规要求的模型就绪数据。本文将为你建立正确的数据工程思维框架,明确其在多模态AI生态中的战略地位,并为后续的深入学习奠定坚实基础。

jiaquan3011的博客 628

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1251

排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这

YuZhiHui_No1的专栏 1万+

Claude Code 常见安装失败问题与解决办法

摘要: Claude Code安装失败通常与环境、网络和权限问题有关,而非软件本身。主要误区包括:命令未识别(需检查PATH和终端重启)、网络连接失败(终端代理配置)、权限不足(系统安全限制)及账号认证问题。首次使用应避免复杂任务,建议从基础功能测试开始。快速自检可按终端重启→命令识别→网络→代理→权限→账号状态的顺序排查。理顺终端、网络和权限后,Claude Code运行将更稳定。 (150字)

sg_knight的专栏 6700

排序算法研究之希尔排序(shell sort)

前面几个小节,我们分别介绍了冒泡排序,插入排序,快速排序 选择排序本节,我们介绍插入排序的改进版的希尔排序。 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接插入排序不同的是,他会优先比较距离较近的元素。因此,希尔排序又叫做缩小增量排序。 1、算法思想 首先,将待排序的序表分割成若干个形如L[i,i+d,i+2d,…… i+kd]的“特殊”子表,然后分别的进行直...

爱喝舒化奶的博客 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

希尔排序(Shell Sort)

插入排序(InsertionSort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。...

happen_sea_roc的博客 2504

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

希尔排序(Shell Sort)

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词...

ThinkWon的博客 9622

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

排序算法(4)希尔排序(Shell Sort)

插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 4、希尔排序(Shell Sort) 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 4.1 算法描述 先将整...

cowbin2012的专栏 1万+

希尔排序详解(Shell Sort)

直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

Wzill 1万+

排序算法-希尔排序(Shell Sort)

文章目录希尔排序法介绍希尔排序法算法时间复杂度其他排序法的比较 希尔排序法介绍 希尔排序法(Shell Sort)是D.L.Shell于1959年提出的一种排序算法,在这之前的排序算法如冒泡排序、简单选择排序、直接插入排序等算法的的时间复杂度都为O(n2)O(n^{2})O(n2),而希尔排序突破了这一时间复杂度。 【原理】 直接插入排序算法比冒泡排序和简单选择排序性能都要高,尤其在序列基本有序并...

白杨 2641

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

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

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

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

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

阿莫夕林的博客 954

十大经典排序算法——希尔排序(Shell Sort)

文章目录算法代码 算法 (1)希尔排序这个名字,来源于它的发明者希尔,也称作“缩小增量排序”,是插入排序的一种更高效的改进版本。 (2)插入排序对于小规模数据数据或者基本有序或者时十分高效。其大规模的乱序数组的时候效率是比较慢的,因为它每次只能将数据移动一位。 (3)希尔排序为了加快插入的速度,让数据移动的时候可以实现跳跃移动,节省了一部分的时间开支。 基本思想: 首先它把较大的数据集合分割成若...

Heorin X的博客 317

希尔排序时间复杂度_排序算法(五):Shell Sort 希尔排序

基本排序算法中的插入排序虽然逻辑较为简单,但当排序规模较大时,经常需要将元素一位一位地从一端移动到另一端,效率非常低。于是Donald Shell设计了一种基于插入排序的改进版排序算法,故被命名为 Shell Sort 希尔排序算法思想插入排序效率低下是因为其移动元素每次只能移动一位,当排序元素的规模较大时,需要将元素一位一位地从一端移动到另一端。而如果我们能够让元素一次性地移动到较远的...

weixin_39883260的博客 4994

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出。它通过将数组分成若干子序列,并对每个子序列进行插入排序,逐步缩小子序列的间隔,最终完成整个数组的排序。

[Blog][Domain] programb.blog.youkuaiyun.com 1136

希尔排序(Shell Sort)-- 高级排序算法

1 希尔排序(Shell Sort) 1959年Shell发明,第一个突破O(n2)O(n^2)O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 算法描述 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述: 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子

OuDiShenmiss的博客 331

排序---希尔排序(Shell Sort)

希尔排序是一种高效的排序算法,由唐纳德·希尔于1959年提出,通过分组插入排序和逐步缩小增量来优化插入排序的性能。其核心思想是将数组按增量分组并排序,最终完成整体排序。增量序列的选择直接影响效率,常见的有希尔原始增量、Knuth增量等。希尔排序时间复杂度取决于增量序列,空间复杂度为O(1),适用于中等规模数据排序和资源受限环境。尽管对大规模数据效率不如高级排序算法,其实用性和简单实现使其成为常用排序方案之一。

MzKyle的博客 2322
上一篇: 经典排序算法(二) —— Bubble Sort 冒泡排序
下一篇: 经典排序算法(四) —— Quick Sort 快速排序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值