插入排序之希尔排序

【排序】插入排序,希尔排序 以上是对插入排序和希尔排序的分析,是一种新的排序思想,其中的种种知识点也很碎很多,希望大家能够有所收获。 阅读详情

1.直接插入排序存在的问题

直接插入排序与希尔排序相比还是有一些问题的。
在这里插入图片描述
结论:当需要插入的数是比较小的数时,后移的次数明显增多,对效率有影响。

2.希尔排序的基本介绍

(1)希尔排序就是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是插入排序,它是简单插入排序经过改进之后的一个更高晓的版本,也成为缩小增量排序。
(2)希尔排序是把记录按下标的一定增量分组,对每个分组使用直接插入算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减少到1时,整个数组就会被分成一组,算法遍中止。

3.希尔排序的示意图

在这里插入图片描述

4.希尔排序代码演示

(1)交换法

@Test
public void testSort(){
    //我们来测一下各种排序速度
    int[] array = new int[100000];
    for (int i = 0; i < array.length; i++) {
        array[i] = (int) (Math.random()*100000);
    }
    long start = System.currentTimeMillis();
    //bubbleSorting(array);//冒泡排序排序100000个数总耗时17984毫秒
    //selectSorting(array);//选择排序排序100000个数总耗时3203毫秒
    //insertSorting(array);//直接插入排序100000个数总耗时1109毫秒
    shellSortByExchange(array);//希尔的交换排序100000个数总耗时7829毫秒
     long end = System.currentTimeMillis();
    System.out.println("总共耗时:"+(end-start));
}
//希尔排序
public void shellSortByExchange(int[] array) {
    //渐渐缩小步长(grap)
    for (int grap = array.length/2; grap >= 1 ; grap/=2) {
        //每一次步长所循环的次数
        for (int i = grap; i < array.length; i++) {
            //遍历各组中的元素
            for (int j = i-grap; j >= 0 ; j-=grap) {
                //交换
                if (array[j] > array[j+grap]) {
                    int temp = array[j];
                    array[j] = array[j+grap];
                    array[j+grap] = temp;
                }
            }
        }
    }
}

(2)移动法

@Test
public void testSort(){
    //我们来测一下各种排序速度
    int[] array = new int[100000];
    for (int i = 0; i < array.length; i++) {
        array[i] = (int) (Math.random()*100000);
    }
    long start = System.currentTimeMillis();
    //bubbleSorting(array);//冒泡排序排序100000个数总耗时17984毫秒
    //selectSorting(array);//选择排序排序100000个数总耗时3203毫秒
    //insertSorting(array);//直接插入排序100000个数总耗时1109毫秒
    //shellSortByExchange(array);//希尔的交换排序100000个数总耗时7829毫秒
    shellSortByMove(array);//希尔的移动排序100000个数总耗时16毫秒
    long end = System.currentTimeMillis();
    System.out.println("总共耗时:"+(end-start));
}
//希尔排序
public void shellSortByMove(int[] array) {
    //渐渐缩小步长(grap)
    for (int grap = array.length/2; grap >= 1 ; grap/=2) {
        //每一次步长所循环的次数
        for (int i = grap; i < array.length; i++) {
           int j = i;
           int temp = array[j];
           while (j-grap >= 0 && temp <array[j-grap]) {
               array[j] = array[j-grap];
               j-=grap;
           }
           //判断此次循环有没有移动
           if (j != i) {
               array[j] = temp;
           }
        }
    }
}

总结:希尔排序的交换法和移动法的效率相差还是挺大的。

Python+pytest+requests 自动化测试框架 环境准备 本次选用的是Python+Pytest+requests来搭建自动化框架,需要有 Python 环境(3.x 版本),安装pytest和requests,不会安装的自行去网上搜教程。 关于 Pytest 的基本使用,这里不作讲解,不清楚的可以看我之前的文章。 简单 Demo 我们先创建一个项目,取名api-test,然后在下面创建一个test_api.py的文件 # test_api.py import pytest import requests def test_01(): 阅读详情

相关推荐

重带电粒子的能量歧离(energy straggling)

能量歧离,Bethe-Bloch

G751888629的博客 2298

数据结构——插入排序与希尔排序

数据结构——插入排序和希尔排序:干货十足,图文并茂,不容错过的优质好文,欢迎小伙伴们前来学习!!!

麦麦的博客 1905

FPGA实现高效数字下变频:CORDIC与CIC滤波器的Verilog优化设计

本文深入探讨了FPGA实现高效数字下变频的技术方案,重点介绍了CORDIC算法与CIC滤波器的Verilog优化设计。通过详细的算法原理分析、FPGA实现技巧和实战经验分享,展示了如何利用CORDIC的旋转运算替代乘法操作,以及CIC滤波器在降采样中的高效性能。文章还提供了完整的系统集成方案和资源优化策略,为无线通信和雷达信号处理领域的工程师提供了实用参考。

redis7keeper的博客 724

插入排序和希尔排序

今天给小伙伴们分享两个比较基础的排序算法,插入排序和希尔排序

Code_Allen的博客 1318

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 336

Simulink封装与库的建立

第二栏设置标签,第三栏是对应变量名,即是第一张图中的常量名。1.先将输入与常量模块相连接并生成子系统。按照如图所示添加修改,最后的效果如下图。封装子系统搭建测试环境。

lensyu1994的博客 1743

插入排序——希尔排序

希尔排序的实现,浅谈希尔排序的时间复杂度

m0_73693552的博客 1234

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1757

排序——希尔排序、插入排序

本节复习排序中的希尔排序,希尔排序属于插入排序。希尔排序的代码和插入排序非常类似。思想却相对于插入排序来说复杂。在复习希尔排序之前, 我们需要先复习一下插入排序。

strive_mianyang的博客 1389

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 749

Allan方差这个工具,怎么把它用的更顺手?(附Allan方差、动态Allan方差代码)

本文详细说明了Allan方差和动态Allan方差的计算过程,并通过递归运算和时间序列选择两种算法提高动态Allan方差的计算效率。文末提供了快速动态Allan方差计算代码。

victoryqian528的博客 374

【C语言】插入排序、希尔排序——动图展示

直接插入时间复杂度是ON2O(N^2)ON2,比如在排逆序数据的时候,但是在有序或接近有序的时间,效率很高,所以希尔排序就对这个缺陷进行了优化,预排序就可以很好解决的这个问题,希尔排序平均复杂度是ON1.3O(N^{1.3})ON1.3。

Eraser的博客 1578

【漏洞复现】Apache Tomcat远程代码执行漏洞(CVE-2024-56337)

CVE-2024-56337是一个存在于Apache Tomcat中的TOCTOU(Time-of-Check Time-of-Use)竞争条件漏洞。此漏洞源于对先前漏洞(CVE-2024-50379)的不完整修复。若默认servlet是可写的(参数readonly设置值为false,该设置为非默认设置)表示不区分大小写文件系统,在负载下并发读取和上传同一文件可以绕过Tomcat的大小写检查。攻击者可以通过构造恶意请求上传含恶意JSP代码的文件,使其触发解析并执行这些文件,从而导致远程代码执行。

李同學AI安全 3197

插入排序、希尔排序

这里定义一个gap,假设gap = 3,将降序序列{9,8,7,6,5,4,3,2,1,0} 按间隔为gap的 为一组进行插入排序,如9,6,3,0为一组,8,5,2为一组,7,4,1为一组,分成这样的三组插入排序,排完后序列变成{0,2,1,3,5,4,6,8,7,9} 将小的基本放在了前面,将大的基本放在了后面,实现了基本的有序,这就为最后一次的排序做了铺垫,这就是预排序。先排9,6,3,0这一组,再排8,5,2这一组,再排7,4,1这一组。因此,我们用数组个数n来控制gap,让它实现多组排序。

SAKURAjinx的博客 289

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pscad IEEE标准系统搭建说明

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

插入排序之折半插入排序、希尔排序

1.折半插入排序: 折半插入排序实际上是对直接插入排序的优化,通过折半查找来找到要插入的位置,再搬移元素,最后插入即可。 思路分析: 定义low为有序部分的第一个位置,high为有序部分的最后一个位置,通过折半查找的方法,不断更新low和high的位置,直到 low>high,此时high+1即为我们要插入的位置。 直接插入排序是在每一次比较时,就进行数据的搬移;而折半插入排序是在找到插入...

林林酱 636

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言——插入排序与希尔排序

1.涉及知识点:基本输入输出,分支与循环语句。2.基本思想:将数组分为已排序区间和未排序区间,然后依次从未排序区间取出元素,插入到已排序区间的合适位置。基本思想:将待排序的数组分成若干个较小的子数组,对这些子数组进行插入排序,然后逐步缩小子数组的规模,直至最后整个数组有序。优化方向:希尔排序通过先使数组局部有序,再逐步扩大有序区域的方式,减少了元素的移动次数,从而提高了插入排序的效率。增量序列的选择和插入排序的实现方式对希尔排序的性能有影响,不同的增量序列可能导致不同的排序效果。例如这样的。

qq_34434522的博客 1383

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

插入排序,希尔排序

插入排序 插入排序是一种比较排序算法 核心思想 在每次遍历序列过程中,从序列中取出一个元素插入到有序序列中,形成新的有序序列,重复该过程,直到遍历完成,形成新的有序序列。 特点: 时间复杂度分析:O(N^2),如果序列在排序前已经是有序序列,则为O(N) 空间复杂度分析:O(1) 数据量较少时效率高。插入排序适合数据量少的情况 算法的实际运行效率优于选择排序和冒泡排序。 稳定排序 — 插入排序...

kevin的博客 641

一种情况下插入排序比希尔排序要快

        我们都知道希尔排序是插入排序的优化。         希尔排序会在进行插入排序前把数列分组,然后会根据需要把数组内部的数字先进行顺序排列,最终减少插入排序时移动元素的次数,达到优化的目的。         但是我这边简化了部分插入排序的代码,结果在最后测试的时候,插入排序竟然会比希尔排序要快。这里似乎是说希尔排序的代码还能再继续优化?或者还有别的原因?这里我只能把该问题记录了。...

qq_35338695的博客 1437

从插入排序到希尔排序

从插入排序到希尔排序插入排序原理插入排序是一种简单直观的排序算法,其基本思想是通过将每个元素逐个插入到已排序的部分中,逐步构建一个有序序列。操作步骤初始化:将第 1 个元素视为已经有序的部分(初始时长度为 1)。遍历数组:从第 2 个元素开始,依次将其视为待插入的“新”元素。查找位置:在已排序部分中找到该元素的正确位置,并将其插入到适当的位置。从已排序部分的末尾向前查找,找到第 1 个小(大)于等...

不只会拍照的程序猿 1022

插入排序与希尔排序

本文是插入排序和希尔排序的学习,本系列将逐步更新排序算法的学习,循序渐进的理解排序算法的精髓,所有的排序算法都介绍完之后,对实际使用中排序算法的最佳实践做一个总结,此后再深入jdk源码,看看jdk提供给我们的排序方法,都用到了怎样的实现...

coderZ666的博客 223

插入排序&希尔排序

【图文】插入排序 1.直接插入 2.希尔排序

TerryZjl的博客 1302

插入排序和希尔排序比较

今天六六给大家总结简单排序和复杂排序中的插入排序和希尔排序: 插入排序原理: a.把所有的元素分为两组,已经排序的和未排序的; b.找到未排序的组中的第一个元素,向已经排序的组中进行插入; c.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到第一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位。 public class insert { public static void sort(Comparable[] a){ for(int i=1;i&lt

linpengwing的博客 1497
上一篇: 直接插入排序算法
下一篇: 交换排序之快速排序
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值