10种排序算法四:希尔排序 - 不稳定

排序算法图解(四):希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称缩小增量排序。希尔排序是非稳定排序算法。把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。 阅读详情

希尔排序


/**
 * 排序算法四:希尔排序:插入排序第二种实现方式的升级版
 * 【思想】计算数组间隔,取每个间隔上的数作为一个数组,进行排序,再对每个间隔上+n的数进行排序,最后缩小间隔至1排序
 * 时间复杂度:n^1.3
 * 空间复杂度:1
 * 【最佳间隔】h=3*h+1
 *
 */
public class ShellSort {

    public static void main(String[] args) {
        int[] arr = {9, 6, 11, 3, 5, 12, 8, 7, 10, 15, 14, 4, 1, 13, 2};
        sort(arr);
    }

    public static void sort(int[] arr) {
        int h = getMaxGap(arr.length);  //最大间隔

        for (int gap = h; gap > 0; gap = (gap - 1) / 3) {   // 计算每次排序的间隔
            System.out.println("间隔gap=" + gap);
            for (int i = gap; i < arr.length; i++) {        // 从间隔开始后面的每个数都要比较
                // j > gap - 1:如果间隔不足间隔,那么就不用再往前面比了,因为前面都没有数可以比了。
                // 为什么是j>gap-1,而不是j>gap,如果gap最小是1的时候,那么arr[1]与arr[0]就比较不到了。
                for (int j = i; j > gap - 1; j -= gap) {
                    if (arr[j] < arr[j - gap]) {
                        swap(arr, j, j - gap);
                    }
                }
            }
            System.out.println(Arrays.toString(arr));
        }
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 得到该数组最大间隔值
     *
     * @param arrLength
     * @return
     */
    public static int getMaxGap(int arrLength) {
        int h = 1;
        while (h <= arrLength / 3) {
            h = 3 * h + 1;
        }
        return h;
    }
}


【排序算法】希尔排序 学习希尔排序前最好先掌握插入排序,在进行;不会的可以点击——> 阅读详情

相关推荐

算法:排序算法之希尔排序

在前面已经对冒泡排序、直接插入排序做了说明分析,本篇将对希尔排序进行相关说明分析。 排序算法系列目录说明 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序(Heap Sort) 计数排序(Counting ...

7-SEVENS 969

数据结构—希尔排序

认识希尔排序 希尔排序也称为缩小增量排序,它的基本思想是: 通过将待排序的元素分为若干个子序列,利用直接插入排序思想对子序列进行排序。然后将该子序列缩小,接着对子序列进行直接插入排序。按照这种思想,直到所有元素都按照关键字有序排列。 增量(gap)的确定方式: 共有3种方法: 1.gap = 需排序的元素个数,每次让 gap /2; 2.取素数,每次让 gap...

WangWt88的博客 1829

【希尔排序】十大排序算法之希尔排序

【希尔排序】十大排序算法之希尔排序,属于不稳定的排序。

✅ Java 开发工程师 520

希尔排序不稳定例子_Python实现希尔排序(已编程实现)

希尔排序:观察一下”插入排序“:其实不难发现她有个缺点:如果当数据是”5, 4, 3, 2, 1“的时候,此时我们将“无序块”中的记录插入到“有序块”时,估计俺们要崩盘,每次插入都要移动位置,此时插入排序的效率可想而知。shell根据这个弱点进行了算法改进,融入了一种叫做“缩小增量排序法”的思想,其实也蛮简单的,不过有点注意的就是:增量不是乱取,而是有规律可循的。希尔排序时效分析很难,关键码的比较...

weixin_39988476的博客 835

Unified Access Control:从NAS到RRC的5G接入控制全流程解析

本文深入解析了5G统一接入控制(Unified Access Control)的全流程,从NAS到RRC的协同工作机制。通过身份核验、业务分类和动态决策三个核心步骤,UAC实现了智能调度和弹性决策,确保海量设备接入时的网络稳定性。文章详细介绍了USIM卡的身份凭证体系、NAS层的业务分类引擎以及RRC层的动态决策机制,并提供了实战案例和常见问题排查方法。

weixin_30855099的博客 589

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们在笔记本部署了Llama 3 8B大模型,使用Ollama搭建了基于Web 可视化对话机器人。在使用过程中,大模型经常出现中文问题英文回答的问题。本博文就用Llama3-Chinese-Chat微调模型来解决这个问题……

老牛啊 9238

面试题:希尔排序是一种稳定排序吗?

面试题:希尔排序是一种稳定排序吗?

小x的博客 2794

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6879

数据结构与算法之六(希尔排序,非稳定排序)

旁白:这一节的内容消化起来没这么容易,那个pdf说的也比较复杂,建议大家在网上搜资料去看原理还容易一点。 希尔排序1.介绍 还记得前面说的三种基本排序吗?插入排序可以说是性能较高的一种,但是如果完全逆序的插入排序,复制和移动效率依然低下。在此基础上有人提出了希尔排序,基于n-增量排序对插入排序进行优化。所谓n增量就是从原序列中选出间隔n的序列2.原理 对于序列序列9,8,7,6,

kkae8643150的专栏 684

CVAT本地部署保姆级教程:用Docker Compose在Ubuntu上5分钟搞定你的私有数据标注平台

本文提供CVAT本地部署的保姆级教程,详细讲解如何在Ubuntu系统上使用Docker Compose快速搭建私有数据标注平台。从环境准备、Docker配置到CVAT部署全流程,涵盖硬件要求、性能优化及安全加固等关键步骤,帮助开发团队5分钟内完成高效、安全的标注环境搭建。

weixin_42619742的博客 383

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 127

[算法]希尔排序——插入排序的升级

1、希尔排序的思想 2、例子 3、希尔排序代码 4、希尔排序的优化 5、希尔排序是不稳定排序

weixin_45922730的博客 706

【CVPR2025 DEIM】超详细!手把手训练自己的数据集教学:从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。本文在win系统上训练,最强实时目标检测算法!

本文详细介绍了CVPR2025 DEIM目标检测模型的完整使用流程。内容包含:1)源码下载与虚拟环境配置;2)Visdrone2019数据集准备与配置文件修改;3)训练参数设置及Windows系统常见问题解决方案;4)模型验证、推理测试及热力图生成方法。特别针对Windows用户提供了虚拟环境配置指导,并详细说明了数据集路径设置、参数调整等关键步骤。通过本文的指导,小伙伴可以快速掌握DEIM模型的使用方法,用于学术论文研究和实验分析。

Ai缝合怪、助力小伙伴高效发论文 7643

不稳定排序算法有哪些

一、不稳定排序算法有哪些 1、堆排序 2、希尔排序 3、快速排序 4、选择排序 口诀:一堆(堆)希尔(希尔)快(快速)选(选择) 二、常见排序算法稳定性分析 1、堆排序稳定性分析 我们知道堆的结构是节点i的孩子为 2*i 和 2*i+1 节点,大顶堆要求父节点大于等于其 2 个子节点,小顶堆要求父节点小于等于其 2 个子节点。 在一个长为 n 的序列,堆排序的过程是从第 n/2 开始和其子节点共 3 个值选择最大(大顶堆)或者最小(小顶堆),这 3 个元素之间的选择当然不...

只为成功找方法 不为失败找借口 2万+

基于Simulink的轨道交通信号控制系统仿真详细介绍

轨道交通信号控制系统是确保列车安全、高效运行的核心技术。通过Simulink进行信号控制系统的仿真,可以验证系统的设计、优化调度策略并提高安全性。以下是如何在MATLAB和Simulink中设计并仿真一个轨道交通信号控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的轨道交通信号控制系统仿真。该系统能够根据列车位置、速度和轨道状态生成控制指令,确保列车的安全、高效运行。通过虚拟场景仿真、硬件在环测试和实机测试,验证了系统的性能,并通过参数优化进一步提升了系统的可靠性。引入智能调度。

xiaoheshang_123的博客 462

Linux 内核中 ARP 协议的全链路解析:从触发机制到物理层发送

核心设计思想按需解析:减少不必要的 ARP 请求,降低网络负载。分层解耦:协议栈各层(邻居子系统、Netfilter、驱动)职责分离,提高扩展性。ARP的核心作用是将IP映射为MAC地址,确保数据链路层能正确封装帧。其触发时机围绕“未知MAC地址需求”展开,覆盖通信初始化、缓存更新、网络变更及维护等多种场景。

数字人生 367

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

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

爱喝舒化奶的博客 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

排序算法问题:稳定排序与不稳定排序

转载自:https://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html 稳定排序和不稳定排序 这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的...

sunshinefcx的博客 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

排序算法 —— 希尔排序

希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定,我们一半去O(N^1.3)。希尔排序并没有开辟额外的空间,空间复杂度为O(1)。希尔排序是不稳定的,如下图:经过希尔排序之后,红色的5在蓝色的5后面了。

知其然 知其所以然 4069

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

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

基本排序算法 之四 ——希尔排序

基本排序算法总结与对比之四 ——希尔排序 1、希尔排序 希尔排序实质是不断对数组分组,并对每组数据进行插入排序,分组由 len/step组 直到1组(len为数组长度,step为分组长度)。 本质上讲,希尔排序算法是直接插入排序算法的一种改进,分组后数据移动长度变短,减少了其复制的次数,速度要快很多。 template<typename ...

带熊超人 的博客 748

希尔排序是一种稳定的排序算法_排序算法的稳定性

定义假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,A1=A2,且A1在A2之前,而在排序后的序列中,A1仍在A2之前,则称这种排序算法是稳定的;否则称为不稳定的。稳定也可以理解为一切皆在掌握中,元素的位置处在你在控制中.而不稳定算法有时就有点碰运气,随机的成分.当两元素相等时它们的位置在排序后可能仍然相同.但也可能不同.是未可知的....

weixin_39585886的博客 3086

不稳定的排序算法(一)

选择排序(Selection sort) 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交

天外来客 4217

排序算法(稳定与不稳定)

稳定排序与不稳定排序

m0_54711064的博客 2230

希尔排序、快速排序、堆排序、简单选择排序是不稳定的排序算法,请各举一例证明

1)冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。 (2)选择排序 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n - 1个元素,第n个元素不用选

corleoen的博客 4178

小学生图解排序算法:④希尔排序

希尔排序是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

纯文笔记 2009
上一篇: 10种排序算法三:插入排序 - 稳定
下一篇: 10种排序算法五:归并排序 - 稳定
seeyoutlb
博客等级 码龄9年 123粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值