数据结构与算法之希尔排序

2023-10-27

希尔排序概念

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

动图展示

在这里插入图片描述

静图分析
在这里插入图片描述

代码实现

import java.util.Arrays;

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        shellSort(arr);
//        [3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
//        [0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
//        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    }

    //希尔排序
    public static void shellSort(int[] arr) {
        //遍历所有的步长
        for (int gap = arr.length / 2; gap > 0; gap = gap / 2) {
            //遍历所有的元素
            for (int i = gap; i < arr.length; i++) {
                //遍历本组中所有元素
                for (int j = i - gap; j >= 0; j -= gap) {
                    //如果当前元素大于加上步长后的那个元素
                    if (arr[j] > arr[j + gap]) {
                        int temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    }
                }
            }
            //打印每次排序后的结果
            System.out.println(Arrays.toString(arr));
        }
    }
}

时间复杂度

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度:O(n^2)
  • 稳定性:不稳定

希尔排序不像其他时间复杂度为O(N log2N)的排序算法那么快,但是比选择排序和插入排序这种时间复杂度为O(N2)的排序算法还是要快得多,而且非常容易实现。它在最坏情况下的执行效率和在平均情况下的执行效率相比不会降低多少,而快速排序除非采取特殊措施,否则在最坏情况下的执行效率变得非常差。

迄今为止,还无法从理论上精准地分析希尔排序的效率,有各种各样基于试验的评估,估计它的时间级介于O(N^3/2)与 O(N^7/6)之间。我们可以认为希尔排序的平均时间复杂度为o(n^1.3)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法之希尔排序 的相关文章

  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 一文了解大厂的DDD领域驱动设计

    1 什么是DDD DDD名为 Domain Driven Design 领域驱动设计 简称 DDD 概念来源于2004年著名建模专家eric evans发表的他最具影响力的书籍 2 DDD与我们的传统开发又有什么区别和优势 有过工作的朋友都
  • EDUCODER---计算机硬件基础---计算机系统测试 5.1&6.1&7.1&9.1 合集

    由于时间关系 在这里我将全部的测试题答案全部发出 5 1 1 5 A D D A D 6 10 C D A B A 6 1 1 5 B A B A A 6 10 A C C A C 7 1 1 5 A C D A B 6 10 B B A
  • GitHub 优秀的 Android 开源项目和框架

    GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理 精品 博客分类 Android 开源集合 本文章已收录于 Git 原文地址为http www trine
  • ubuntu中执行脚本出现no such file or directory

    问题 在ubuntu下执行 sh文件大多数情况下只需要注意给脚本文件添加可执行权限就可以了 但是有些情况下会出现这种问题 从上图可以看到 文件夹中的几个脚本文件的权限都达到了 777 按理说任何用户都可以执行这些脚本 但是执行其中任意的就出
  • 【最详细附安装包】Visual Studio2022安装教程

    软件下载 软件 Visual Studio 版本 2022 语言 简体中文 大小 4 11M 安装环境 Win11 Win10 Win8 Win7 硬件要求 CPU 2 0GHz 内存 4G 或更高 下载通道 百度网盘丨下载链接 https
  • JVM方法句柄

    JVM方法句柄 方法句柄是一个强类型的 能够被直接执行的引用 该引用可以指向常规的静态方法或者实例方法 也可以指向构造器或者字段 当指向字段时 方法句柄实则指向包含字段访问字节码的虚构方法 语义上等价于目标字段的 getter 或者 set
  • antd v5 pro 项目登录页面刷新后登录成功跳转失败

    问题 之前版本没有这个问题 升级后出现 只有第一次 或者关闭浏览器重新打开时点击登录 才可以进入 点击浏览器刷新 登录成功 跳转为当前页面 排查 第一步 显示登录成功 但跳转失败 说明await fetchUserInfo 有问题 第二步
  • 7种PCB走线方式

    01电源布局布线相关 数字电路很多时候需要的电流是不连续的 所以对一些高速器件就会产生浪涌电流 如果电源走线很长 则由于浪涌电流的存在进而会导致高频噪声 而此高频噪声会引入到其他信号中去 而在高速电路中必然会存在寄生电感和寄生电阻以及寄生电
  • Node=>Express中间件分类 学习4

    1 中间件分类 应用级别的中间件 路由级别的中间件 错误级别的中间件 Express 内置的中间件 第三方的中间件 通过app use 或app get 或app post 绑定到app实力上的中间件 叫做应用级别的中间件 绑定到expre
  • PCA算法人脸识别小结--原理到实现

    近段时间学习提取图像特征的算法 研究了一下PCA 主成分分析 算法 用PCA实现了人脸识别 做个小结 以下是关于PCA算法原理理解较有帮助的资料 关于PCA的资料很多 我觉得看以下的足够了 1 A tutorial on Principal
  • 理解卷积神经网络(Convolutional Neural Networks, CNN)

    1 对于卷积的粗浅理解 数学角度 1 公式 1 所示的积分被称为卷积 判断一个积分是不是卷积 其核心在于将两个函数的自变量相加后 看其积分变量是否能够被消去 若可以被消去 那就是卷积 物理角度 卷积就是瞬时行为导致的持续性后果之总和 应用角
  • 8. 让java性能提升的JIT深度解剖

    JVM性能调优 1 C1 C2与Graal编译器 1 1 C1编译器 1 2 C2编译器 1 3 分层编译 2 热点代码 3 热点探测 4 方法调用计数器 5 回边计数器 6 编译优化技术 6 1 方法内联 7 锁消除 8 栈上分配 9 逃
  • 调用twitter api 接口获取关注用户的最新推文

    概要 本篇文章通过最简单的web url的方式访问推特API获取推文 不需要下载官方的SDK 需具备以下条件 1 访问外网 2 会使用及编码谷歌浏览器插件 浏览器插件具备跨域访问的能力 普通web网页不具备 1 有个推特账号 现在ZM关系紧
  • C# DateTime的ToString()方法的使用

    Console WriteLine ToShortDateString DateTime Now ToShortDateString Console WriteLine ToLongDateString DateTime Now ToLon
  • restapi:上传文件接口开发

    调用别人提供的url 进行文件上传接口开发 ResponseBody RequestMapping value uploadPaasRes method RequestMethod POST public Map
  • 多语言跨境商城/跨境电商/一键铺货/商家入驻/虚拟订单/国际支付/自带采集/拍卖功能

    源码内容简介 1 支持商家入驻 2 商家独立后台 3 平台商城自带产品库 4 商家从产品库一件铺货 5 国际物流 国际支付 6 数十种多语言 市面上五种六种语言垃圾源码请误碰瓷 7 虚拟订单 虚拟地址 虚拟客户 8 后台设置虚拟访问量 9
  • 芯片测试的DC/AC/Fast/slow模式

    目录 1 AC DC介绍及区别 2 DC AC mode a DC mode b AC mode 1 AC DC介绍及区别 70年代到1995年这段时间里 由于芯片的工作频率很低只有20 100M scan测试只有DC SCAN 我们就能捕
  • Linux的vim的常用命令21.1.8

    模式切换 命令 操作 Ctrl Alt t 打开命令窗口 xrander s 1920x1200 调节分辨率 Ctrl l 清屏 a 在光标后插入 i 在光标所在位置插入 o 在光标所在位置的下一行插入 esc 进入命令模式 进入行命令模式
  • 如何查看win10系统的激活情况

    前言 我们经常不知道 所使用的系统是永久激活版 还是 短时间激活的 一般的 电脑属性 里面是看不到的 解决 点击 运行 输入 slmgr vbs xpr确定 会弹出激活情况 也可以看更详细的 运行 输入 slmgr vbs dlv确定 会列
  • 数据结构与算法之希尔排序

    目录 希尔排序概念 代码实现 时间复杂度 希尔排序概念 希尔排序 Shell Sort 是插入排序的一种 也称缩小增量排序 是直接插入排序算法的一种更高效的改进版本 希尔排序是非稳定排序算法 该方法因DL Shell于1959年提出而得名