首页 > 编程语言 >JavaScript 实现 -- 希尔排序

JavaScript 实现 -- 希尔排序

时间:2022-10-22 23:31:17浏览次数:76  
标签:arr -- JavaScript 步长 希尔 step 数组 排序

希尔排序

希尔排序是插入排序的一种,又称“缩小增量排序”(Diminishing Increment Sort),是插入排序的一种更高效的改进版本。 希尔排序实际上就是分组的插入排序,希尔排序以步长为分组,然后不断减少步长。当步长为1时,数组就是有序的了,先看一下希尔排序的过程,图中各色彩线的两端为不同分组。

希尔排序过程

  • [9,2,5,4,7,1,3,6,8,0]*是待排序的数组,第一次遍历时步长为 5,所以待排序的数组分为[9,1],[2,3],[5,6],[4,8],[7,0]五个子数组,将五个子数组进行插入排序,得到[1,9],[2,3],[5,6],[4,8],[0,7]。然后不断减小步长,当步长为1 时,即完成了数组的希尔排序。

代码实现

通过三层循环实现希尔排序:

 		 Array.prototype.shellSort = function(){
            //step 分组步长,通过for不断减小步长,直到步长为1
            for (let step = Math.floor(arr.length / 2); step > 0; step = Math.floor(step / 2)) {
                for (let i = step; i < arr.length; i++) { 
                    for (let j = i - step; j >= 0 && arr[j] > arr[step + j]; j -= step) {
                        [ arr[j], arr[step + j] ] = [ arr[step + j], arr[j] ]  
                    }
                }
            }
        }
        const arr = [9,2,5,4,7,1,3,6,8,0]
        arr.shellSort()
        console.log('完成希尔排序:' + arr)

控制台输出: 在这里插入图片描述 控制台输出符合预期,我们再回头来看看代码,这三层循环有点复杂,我们把step,j 以及数组打印出来,看看这三层循环都干了什么事情。 在这里插入图片描述 看完输出结果,问题就清晰多了。

  • 第一层循环的作用就是不断减小步长;
  • 第二层循环的作用遍历不同步长下的数组元素;
  • 第三层循环的作用是进行插入排序;

时间复杂度和稳定性

  • 希尔排序的平均时间复杂度n*log2n
  • 希尔排序是不稳定的排序算法

标签:arr,--,JavaScript,步长,希尔,step,数组,排序
From: https://blog.51cto.com/u_15718546/5786217

相关文章

  • nan踩坑记
    检查数据如果输入的是图片数据,先检查是否有打不开的图片/大小明显异常的图片;检查输入模型的数据是否与所使用的loss函数提供接口中的要求相一致。检查所有除式中的......
  • GitHub Pages 和 Jekyll 笔记
    GitHubPages和Jekyll笔记快速创建(使用默认的Jekyll引擎)1.新建仓库新建一个空仓库,名称为username.github.io,其中username就是你的GitHub账号名称2.增加文......
  • nvue跟随软件
    nvue跟随软件uni.onKeyboardHeightChange(item=>{ //获取系统信息 let_sysInfo=uni.getSystemInfoSync(); let_heightDiff=_sysInfo.screenHeight-_sysInfo......
  • 熟悉编程语言
    熟悉编程语言最受欢迎的编程语言top50这50种编程语言的编程泛型命令式:FORTRAN、BASIC、C++面向过程:C、COBOL、Fortran面向对象:C++、Java、PHP、python、go、Obj......
  • ubuntu2004使用bind9配置dns服务器
    使用bind9可以配置的NDS服务器类型有五种:分别为缓冲服务器、主服务器、从服务器、混合服务器以及私密服务器。这次主要试了下主服务器。1.安装bind9 sudoapt-getins......
  • Python元类详解
    目录PythonMetaClass一、万物皆对象1、简介2、Python对象3、type|object|class3.1关系3.2创建类的第二中方式二、元类1、什么是元类2、调用流程3、函数做元类4......
  • 2022-2023-1 20221419 《计算机基础与程序设计》第8周学习总结
    2022-2023-120221419《计算机基础与程序设计》第8周学习总结作业信息班级:[2022-2023-1-计算机基础与程序设计]https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP......
  • 面向对象
    三大特性封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对......
  • [网鼎杯 2018]Fakebook
    打开题目  jion注册,点击admin进入主页  发现注入点no?no=1and1=1正常?no=1and1=1报错猜列数    菜擦才能得出基本为分几次日本v人vgtr给他人......
  • 【.NET 6】RabbitMQ延迟消息指南
    背景最近遇到一个比较特殊需求,需要修改一个的RabbitMQ消费者,以实现在消费某种特定的类型消息时,延迟1小时再处理,几个需要注意的点:延迟是以小时为单位不是所有消息都延迟......