JavaScript 实现 -- 希尔排序

2023-10-27

希尔排序

希尔排序是插入排序的一种,又称“缩小增量排序”(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
  • 希尔排序是不稳定的排序算法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 实现 -- 希尔排序 的相关文章

  • 数据结构小白之插入排序算法

    1 插入排序 1 1 思路 将n个需要排序的元素看成两个部分 一个是有序部分 一个是无序部分 开始的时候有序表只有一个元素 无序表有n 1个元素 排序过程中每次从无序表中取出元素 然后插入到有序表的适当位置 从而成为新的有序表 类似排队 如
  • 数据结构之图的两种遍历实现(C语言版)

    上一期文章分享完了图的两种遍历方式 也是两种很重要的算法 DFS和BFS 这两种算法的应用和重要性我就不多说了 内行的人懂的都懂 今天这文章重要就是来上机实现这两种算法 又由于这两种算法都可以由邻接矩阵和邻接表来表示 博主分享的代码都是上机
  • 九种常见排序的比较和实现

    首先排序算法大的可以分为 关键字比较 非关键字比较 关键字比较 关键字比较就是通过关键字之间的比较和移动 从而使整个序列有序 而关键字比较的算法 又可以像下面这样划分 对于排序算法之间的比较 无异于时间复杂度和空间复杂度 看下面这张表格 由
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • 数据结构与算法-列表(双向链表)设计及其排序算法

    0 概述 本文主要涵盖列表 双向链表 的设计及其排序算法的总结 列表是一种典型的动态存储结构 其中的数据 分散为一系列称作节点 node 的单位 节点之间通过指针相互索引和访问 为了引入新节点或删除原有节点 只需在局部调整少量相关节点之间的
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 分治-归并算法——LCR 170. 交易逆序对的总数

    文章目录 0 归并排序 1 题目 2 算法原理 3 代码实现 0 归并排序 归并排序是典型的分治 将数组分成若干个子数组 数组两两比较 不是很清楚的 可以查看此篇文章 数据结构 七大排序 这里以力扣 9
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)

    算法原理 希尔排序是一种基于插入排序的排序算法 也被称为缩小增量排序 它通过将待排序的序列分割成若干个子序列 对每个子序列进行插入排序 然后逐步缩小增量 最终使整个序列有序 算法描述 希尔排序 Shell Sort 是一种基于插入排序的算法
  • 牛客剑指offer刷题其他算法篇

    文章目录 构建乘积数组 题目 思路 代码实现 第一个只出现一次的字符
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • 八大排序(希尔排序)

    上篇文章我们来看了看插入排序是怎么实现的 本章内容就是在插入排序的基础上完成希尔排序 希尔排序是一个比较强大的排序 我们希尔排序的时间复杂度是比较难算的 这里直接给出的结论就是时间复杂度就是O N 1 3 比较难算的原因就是我们每一次的次数
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • DirectShow应用——支持Windows Media格式

    大家知道 微软定义了自己的一种媒体文件类型 叫做ASF Advanced Systems Format ASF其实是一个文件 容器 它本身并没有规定音视频的压缩格式 在ASF文件中 我们可以包含任何格式的压缩的 包括MPEG 4 或非压缩的
  • 抽象工厂设计模式的扩展

    american com itheima pattern factory config factory AmericanCoffee latte com itheima pattern factory config factory Latt
  • 【Apache Spark 】第 11 章使用 Apache Spark 管理、部署和扩展机器学习管道

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • git分支合并错误回滚

    1 合并 比如testB分支合并testA分支 2 还原 如果合并时 代码有错误 已经提交的远程分支 可以参考tortoisegit 还原到某个版本 强制还原 3 重新合并 可重新执行合并流程 改过错误代码后 重新提交的远程分支
  • Java异常类详解

    目录 异常简介 异常体系 异常的处理 自定义异常类 一 异常简介 1 1 异常定义 异常是运行程序的过程中产生的异常情况 异常的情况是指程序在运行过程中 可能由于外界条件的变更 不设想的不一致 导致出现错误的情况 如数据库连接 异常不同于常
  • C++类对象创建过程(分配空间、赋值和初始化、对象初始化顺序、虚函数表指针)

    http my oschina net alphajay blog 5029 from rss 初看到这个题目 你可能会有些疑惑 C 类对象的创建还有什么好说的 不就是调用构造函数么 实际上情况并不是想象中的那么简单 大量的细节被隐藏或者被
  • Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件

    场景 Node RED简介与Windows上安装 启动和运行示例 Node RED简介与Windows上安装 启动和运行示例 霸道流氓气质的博客 CSDN博客 在inject节点可以设置重复触发的周期性事件 比如每两秒输出一次时间 注 博客
  • Windows系统服务器如何磁盘挂载

    桌面远程登录服务器后 服务器桌面上只有一个回收站的 我们在桌面空白处右键属性 gt 桌面 gt 自定义桌面 gt 然后把我的电脑前面的框框勾上 再然后点应用 确定 ok 回到桌面我们就能看到我的电脑了 步骤 点击我们电脑 gt 右键管理 g
  • VSCODE设置位置

    目录 设置位置 用户区 工作区 设置方法 设置编辑器 设置文件 结束 设置位置 VSCODE设置位置分为用户区和工作区 用户区 用户设置是全局的 对所有工作区和项目都有效 用户设置会存储在用户的配置文件夹中 并以settings json文
  • oceanbase 与hbase主要区别

    oceanbase支持跨表的事务 而hbase中支持跨行的事务 这是由他们的设计特别决定的 updateserver实际上是将Hbase所有ReginonServer的memtable聚合在一起 regionserver只服务一部分tabl
  • 编程tips

    一 是XOR 是不等于 if a b 和if a b 对对于聪明的编译器来说效率应该是一样的 二 与 的优先级比 高一级 表达式的结合次序取决于表达式中各种运算符的优先级 优先级从上到下依次递减 最上面具有最高的优先级 逗号操作符具有最低的
  • Spring中AOP

    1 概述 AOP 面向切面编程 将程序中的非业务代码抽取 在不修改业务代码的前提下 为其添加功能 功能增强 面向切面的编程思想底层是为目标创建一个代理对象 让代理对象调用目标类中方法 在代理对象调用时 可以额外的调用其他的方法 增强的方法
  • hduoj 2011

    多项式求和 Problem Description 多项式的描述如下 1 1 2 1 3 1 4 1 5 1 6 现在请你求出该多项式的前n项的和 Input 输入数据由2行组成 首先是一个正整数m m lt 100 表示测试实例的个数 第
  • Linq to Sql : 并发冲突及处理策略

    0 并发冲突的示例 单用户的系统现在应该比较罕见了 一般系统都会有很多用户在同时进行操作 在多用户系统中 涉及到的一个普遍问题 当多个用户 同时 更新 修改或者删除 同一条记录时 该如何更新呢 下图展示了开放式并发冲突的一个示例 假设数据库
  • OpenGL片段列表渲染:实现流畅的大规模场景渲染

    OpenGL片段列表渲染 实现流畅的大规模场景渲染 在实时渲染领域 处理大规模场景是一项重要的任务 然而 传统的渲染方式存在着效率低下 内存消耗大等问题 为了解决这些问题 最近的研究中提出了使用片段列表进行场景渲染的方法 本文将介绍如何使用
  • python批量写入数据

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 python批量写入文件内容 前言 一 使用步骤 1 引入库 前言 提示 这里可以添加本文要记录的大概内容 python批量写入文件内容 提示 以下是本篇文章正文内容 下面案
  • 数字后端——信号完整性分析

    随着光刻和集成电路制造工艺的不断进步 以及芯片的特征尺寸从深亚微米到纳米的迅速采用 人们一方面因为芯片的功能极大提高而受益 另一方面 当逻辑门的沟道长度减小时 门的开关时间会减小 这意味着输出驱动器上升时间变短 或者说时钟频率可以更高 同时
  • Web和Servlet

    Web web开发概述 学习web开发 需要先安装一台web服务器 将开发好的web项目部署在web服务器中供外界访问 web开发环境搭建 Web服务器是指驻留于英特网上某种类型计算机的程序 可以向浏览器等Web客户端提供文档 也可以放置网
  • 万亿级KV存储架构与实践

    一 KV 存储发展历程 我们第一代的分布式 KV 存储如下图左侧的架构所示 相信很多公司都经历过这个阶段 在客户端内做一致性哈希 在后端部署很多的 Memcached 实例 这样就实现了最基本的 KV 存储分布式设计 但这样的设计存在很明显
  • JavaScript 实现 -- 希尔排序

    文章目录 希尔排序 代码实现 时间复杂度和稳定性 希尔排序 希尔排序是插入排序的一种 又称 缩小增量排序 Diminishing Increment Sort 是插入排序的一种更高效的改进版本 希尔排序实际上就是分组的插入排序 希尔排序以步