算法学习笔记(6)-希尔排序

深入YOLOv8内部核心:用RepNCSPELAN4深度重构主干网络,即插即用的高效涨点方案 本文提出了一种改进YOLOv8目标检测模型的方法,通过在YOLOv8中引入RepNCSPELAN模块来提高检测性能。该模块融合了RepVGG重参数化思想与CSP-ELAN结构,在保持推理速度的同时增强特征表达能力。实验结果表明,改进后的RepNCSPELAN-YOLOv8相比原模型在多项指标上均有提升:准确率从0.84提高到0.86,召回率从0.72提升至0.81,mAP50和mAP50-95也分别提高了0.06和0.04。文章详细介绍了模块设计原理和移植步骤,包括配置文件创建、代码修改等关键环节,为YOL 阅读详情

希尔排序算法(ShellSort)由计算机科学家Donald L.Shell与1959年发现,该算法基于插入排序,但是增加了一个特殊的实现机制,使得希尔排序算法能大大地优于插入排序算法。依赖于这个特殊的实现机制,使得希尔排序对多达几千的数据项的排序来说性能良好,其时间复杂度为O(N(logN)^2)。

一、希尔排序和增量排序的比较

  • 插入排序-复制的次数太多:再插入排序执行到一半时,标记符左边这些数据项是排过序的,而标记符右边的数据项都没有排过序,这个算法取出标记符指向的标记项,并且将其存储在临时变量中,接着,从刚刚删除的这个标记项的左边一项开始,将这个临时变量一一插入试探,知道插入的位置正好使得标记项左边全部有序。这样就带了个一个问题,就是需要多次的移动和复杂数据项,造成算法的时间复杂度很大(插入排序的时间复杂度为O(N^2))。
  • n-增量排序:这个是基于插入排序的一种排序思想,即加大对比的距离,从而达到减少对比的数据项的效果,当n=1时就是普通的插入排序了,当n=2时,就是对0、2、4、6…项进行排序;n越大,需要排序的项就越少,当n=1时,大部分数据都已排好了顺序,从而达到优化插入排序时间的目的。

二、Knuth序列

这是希尔排序中常用的一种增序排列的序列,被称为Knuth序列;
Knuth序列

三、希尔排序的思想

在希尔排序中,首先要通过一个循环中使用Knuth序列的生成公式来计算出最初的间隔n。n值最初被赋值为1,然后应用公式n = 3*n + 1生成序列1,4,13,40,121,364,等等。当间隔n大于数组大小时这个循环过程停止。对于一个含有1000个数据项的数组,序列的第七个数字1093就太大了,因此使用序列的第六个数字作为最大的间隔来开始这个排序过程,即从364-增序排列。然后,每完成一次排序过程的外部循环,都用公式n = (n - 1)/3来倒推出下一个间隔。

四、希尔排序Java实现

public class ShellSort {
   @Test
   public void testHeapSort() {
       int[] array = {151, 10, 15, 18, -1, -51, 1, 0, 10};
       sort(array);
       System.out.println(Arrays.toString(array));
   }



   public void sort(int[] nums) {
       // 思想:首先安装knuth序列构造出步长h,当h大于等于1时,不断的进行步长插入排序即可
       int n = nums.length;
       // 构造初始步长h
       int h = 1;
       while (h < n / 3) {
           h = 3 * h + 1;
       }
       // 当步长大于等于1时,进行步长插入排序
       while (h >= 1) {
           for (int i = h; i < n; i++) {
               for (int j = i; j - h >= 0 && nums[j] < nums[j - h]; j -= h) {
                   swap(nums, j, j - h);
               }
           }
           // 将步长缩小
           h /= 3;
       }
   }

   private void swap(int[] array, int k, int j) {
       int temp = array[k];
       array[k] = array[j];
       array[j] = temp;
   }
}

// [-51, -1, 0, 1, 10, 10, 15, 18, 151]
SAP Fiori 从技术上而言到底包含哪些组件? SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深 阅读详情

相关推荐

大数据实时+离线项目架构----智慧物流大数据平台(超流行框架!)

智慧物流大数据平台 文章目录智慧物流大数据平台一、项目背景二、逻辑架构三、解决方案技术亮点:数据流转四、项目的技术选型4.1流式处理平台4.2 分布式计算平台4.3 海量数据存储框架软件版本总结 一、项目背景 本项目基于一家大型物流公司研发的智慧物流大数据平台。该物流公司是国内综合性快递、物流服务商,并在全国各地都有覆盖的网点。经过多年的积累、经营以及布局,拥有大规模的客户群,日订单达上千万。如此规模的业务数据量,传统的数据处理技术已经不能满足企业的经营分析需求。公司需要基于大数据技术构建数据中心,从而挖

weixin_48143996的博客 6431

希尔排序Shell之Knuth序列实现

【代码】希尔排序Shell之Knuth序列实现。

2302_76323000的博客 226

PMOS过压保护电路设计与仿真优化策略

本文深入探讨PMOS过压保护电路(OVP)的设计与仿真优化策略,详细解析PMOS管选型、稳压管特性及三极管配置等关键要素。通过Proteus仿真案例揭示典型设计误区,并提供响应速度提升、抗干扰设计等进阶优化方案,助力工程师实现高可靠性的电源保护系统设计。

weixin_42620340的博客 442

排序系列总结

排序系列 冒泡排序 三种写法 (1)一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位; 代码:代码小抄:十大排序算法(C++实现) (2)经过优化的写法:使用一个变量记录当前轮次的比较是否发生过交换,如果没有发生交换表示已经有序,不再继续排序; 代码: public static void bubbleSort(int[] arr) { // 初始时 swapped 为 true,否则排序过程无法启动 boolean swapped = true; for (int i

m0_52835296的博客 454

机器人学习-matlab四足机器人控制仿真

《机器人学,机器视觉与控制》学习笔记 使用工具箱版本9.10 题目与解决思路: 【1】. 通过减少复位期间的抬腿高度来缩短复位的轨迹 Z轴向下,为了减小复位器件的抬腿高度,应当缩小△Z,故可以将示例程序中zu值调大。 【2】. 增加腿的步幅 腿的步幅可由改变x方向上腿前进和后退运动的极限来达到,令xf = 7; xb = -xf;即可。 ...

weixin_44609769的博客 5540

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1566

十大经典排序算法

基于C语言实现的十大经典排序算法

yzd111的博客 301

均值回归 高频交易_基于布林带的均值回归交易策略

BOLL指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。由于之前大部分交易策略都是选股或者趋势追踪的择时,...

weixin_42528534的博客 1459

常用排序算法实现

常用排序算法 目录 常用排序算法 1 1. 插入排序 1 2. 希尔排序 2 3. 冒泡排序 3 4. 快速排序 4 5. 选择排序 5 6. 归并排序 6 1. 插入排序 public class InsertSort { /** * @Title: insertSort * @Descr...

Young_Fee的博客 395

2025华为杯第二十二届中国研究生数学建模竞赛E题:高速列车轴承智能故障诊断问题 - 完整解题分析+完整MATLAB源码!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1998

仿真学习系列(四十九):Sigrity仿真之电容库制作

在高速电路设计中,电源完整性(PI)是确保系统稳定、可靠运行的关键因素。随着电子产品对性能的要求不断提升,PDN(电源分配网络)的设计与优化变得尤为重要。为了确保电源网络在高速工作状态下不会引发电压波动和信号干扰,我们需要在设计中精确地选择电容器进行优化,而电容库的制作则是这一过程的核心。 OptimizePI作为一个强大的电源完整性优化工具,能够帮助设计师根据不同的目标,批量进行PDN仿真,以得出最佳电容选择。

案例文章,高速信号 228

回炉篇13—数据结构(12)之高级排序

前言: 前面的文章有提到冒泡、选择、插入排序算法,时间复杂度都是O(n2),数据量大时,速度会很慢。 本篇介绍两个高级排序算法:希尔排序和快速排序。 1.希尔排序 希尔排序是优化版的直接插入排序,在直接插入排序的基础上增加一个新特性。 希尔排序通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能够大跨度的移动。当这些数据项排过一趟序后,希尔排序算法减小数据项的...

qq_41741395的博客 379

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2727

希尔排序算法

一文速学希尔排序算法图解

chenchenchencl的博客 6990

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

一、什么是希尔排序 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万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

qq_19774249的博客 3618

希尔排序算法——C++

希尔排序是第一个在空间复杂度为O(1)条件下,将数组排序的时间复杂度降到O(logn^2)的算法,具有巨大历史意义,为后面的堆排序,快速排序提供了极大的启发和参考。故希尔排序时间复杂度为O(logn^2),空间复杂度为O(1)。 希尔排序是对插入排序的一种改进算法,由于插入排序只在数据较少且基本有序时效率才是最佳的,故希尔排序原理将整个数组分为多个分组,然后分别进行排序。分组的其中一个原则是两个分组的元素尽量间隔较远,以消除逆序对,提高排序效率。 由上一篇的堆排序可知,排序本质是对逆序对的消除,堆排序就

净无邪博客 3661

【算法】————6、希尔排序

算法简介 希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。动态定义间隔序列的算法是《算法(第4版》的合著者Robert Sedgewick提出的。 算法描述和实现 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述: <1>. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; <2...

Fly_鹏程万里 469

希尔排序增量的选取_【算法】排序算法之希尔排序

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

weixin_34141225的博客 6608

【算法学习】 七 希尔排序

希尔排序,插入排序的plus版本,图文并茂,方便理解

程序猿学社的博客 4593

实现希尔排序算法

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

xiezhi123456的博客 2066

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

一、排序算法系列目录说明冒泡排序(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

排序算法——希尔排序

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

数据联盟 2387

JAVA排序算法之希尔排序

基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。 希尔排序法基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止 希尔排序法的示意图 代码实...

imust的博客 1729

排序算法之【希尔排序】

希尔排序,作为一种高效的排序算法,更是在排序算法这个舞台上展现出了自己独特的魅力,听这个名字就感觉这个排序不简单,本篇文章我将带领大家深入了解希尔排序。本篇文章主要介绍了希尔排序,希尔排序的时间复杂度与增量序列的选择有关,它是一种不稳定的排序算法,适用于中等规模的数据排序。

2202_75605090的博客 1740
上一篇: Linux(4)-vim的常用快捷键
下一篇: 数据结构(3)-链表(1)
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值