希尔排序

news2024/12/23 10:47:41

希尔排序

排序步骤

1、分组,以任意长度进行分组(这个长度我们称作增量gap);通常以总长度的一半这个数为依据进行分组,每间隔 gap 个数即为一组

2、组内排序;组内使用插入排序法进行排序

3、重新设置间隔分组;此次间隔数一般为原来的间隔数 gap 的基础上减半

4、组内排序

....... 

重复如上操作,最终,间隔数会减半到1,实现整体的插入排序,整体序列变为有序

什么不直接使用插入排序法?

希尔排序实际上是对插入排序的一种优化。插入排序在面对大规模的杂乱的数据时,需要进行多次交换,较为复杂;而希尔排序将大规模的数据减半,极大缩小了需要排序数据的规模,同时在最终的整体的数据进行排序时,整体数据近乎有序,此时进行插入排序的效率好

解析说明

希尔排序的效率取决于增量的选取,时间复杂度并不是一个定值

1) 最好情况:序列是正序排列,在这种情况下,需要进行的比较操作需(n-1)次。后移赋值操作为0次。即O(n)
2) 最坏情况:O(nlog2n)
3) 平均时间复杂度:O(nlog2n)

开始时,gap 取值较大,子序列中的元素较少,排序速度快,克服了直接插入排序的缺点

其次,gap值逐渐变小后,虽然子序列的元素逐渐变多,但大多元素已基本有序,所以继承了直接插入排序的优点,能以近线性的速度排好序

因此,希尔排序的时间复杂度相对于O(n²)好一些

最优的空间复杂度为开始元素已排序,则空间复杂度为 0;

最差的空间复杂度为开始元素为逆排序,则空间复杂度为 O(N);

平均的空间复杂度为O(1)

希尔排序代码

import org.junit.Test;

public class ShellSort {

    @Test
    public void test(){
        int[] arr = new int[]{12, 15, 4, 5, 8, 35};
        shellSprt(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }


    public static int[] shellSprt(int[] arr){
        int gap = arr.length /2;//一开始时的间距数
        int temp = 0;//插入排序的临时数

        while(gap > 0){//最后一遍排序的gap值为1
            for (int i = gap; i < arr.length; i++) {//每组的第一个数被认为是有序。因此从第二组数开始进行插入排序
                temp = arr[i];//当前需要插入的数
                for (int j = i; j >= gap; j -= gap) {//每组之间的每个数之间都相差gap个数
                    if(temp < arr[j - gap]){//插入排序向前比较
                        arr[j] = arr[j - gap];
                    }else{
                        break;//找到插入的位置则退出
                    }
                    arr[j - gap] =temp;//需要插入的位置
                }
            }
            gap /= 2;//gap不断减半直到其值为1
        }

        return arr;
    }
}

引用

【算法】排序算法之希尔排序 - 知乎 (zhihu.com)

排序:希尔排序(算法) - 简书 (jianshu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/754852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wi-Fi 相关概念

Wi-Fi 相关概念 802.11 Wi-Fi 标准及其含义频宽 和 带宽 的概念20MHz与40MHz的区别2.4G 频段2.4G的频道编号和中心频率 5G WiFi 频段中国开放的的5G WiFi频段&#xff1a;5G的频道编号和中心频率&#xff1a; 802.11历史进程一、802.11重要发展二、802.11协议族 参考 802.11 Wi…

阿里云 OSS 静态网站托管

本文节选自我的博客&#xff1a;阿里云 OSS 静态网站托管 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖的猫&…

云计算的学习(六)

六、云计算的发展趋势 1.云计算相关领域介绍 1.1物联网 物联网来源于互联网&#xff0c;是万物互联的结果&#xff0c;是人和物、物和物之间产生通信和交互。 物联网主要技术&#xff1a; RFID技术&#xff08;射频识别技术&#xff09;传感器技术嵌入式系统技术 1.2大数据…

SpringBoot+actuator和admin-UI实现监控中心

使用SpringBoot很久了&#xff0c;但是很少使用到SpringBoot的查看和监控&#xff0c;将来八成也不会用到&#xff0c;万一有机会用到呢&#xff1f;所以记录一下以前学习SpringBootactuator和adminUI实现监控中心的方式 Springboot的版本2.0.x <parent><groupId>…

在Linux下做性能分析2:ftrace

介绍 在我们进一步介绍更多模型分析技巧前&#xff0c;我们先要对基本工具有一些了解。这一篇先介绍ftrace的基本用法。 ftrace在内核的Documentation目录下已经有文档了&#xff0c;我这里不是要对那个文档进行翻译&#xff0c;而是要说明这个工具的设计理念和使用策略。细节…

H3C-Cloud Lab实验-链路聚合实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1、按照图示配置PC3和PC4的IP地址 2、在SW1和SW2的两条直连链路上配置链路聚合&#xff0c;实现链路冗余&#xff0c;并可以增加传输带宽 3、SW1和SW2之间的直连链路要配置为Trunk类型&#xff0c;允许所有vlan通过 4、中断SW…

基于JavaSwing+Mysql的仓库销售管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88049275 JDK1.8 MySQL5.7 功能&#xff1a;管理员与员工两个角色登录&#xff0c;基础数据查找&#xff0c;仓库查找&#xff0c;增删改查仓库信息、商品等 源码数据库文件配置文件课程设…

java单元测试(调试)

文章目录 测试分类JUnit单元测试介绍引入本地JUnit.jar编写和运行Test单元测试方法设置执行JUnit用例时支持控制台输入10.6.6 定义test测试方法模板 测试分类 **黑盒测试&#xff1a;**不需要写代码&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值。 **白盒测试…

LangChain + ChatGLM2-6B 搭建个人专属知识库

之前教过大家利用 langchain ChatGLM-6B 实现个人专属知识库&#xff0c;非常简单易上手。最近&#xff0c;智谱 AI 研发团队又推出了 ChatGLM 系列的新模型 ChatGLM2-6B&#xff0c;是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;性能更强悍。 树先生之所以现…

GitUI汉化

1.下载汉化文件 下载地址 备用下载地址 https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip 2.找到git安装路径 C:\Program Files\Git\mingw64\share\git-gui\lib 3.解压出1下载的文件 复制粘…

配置无线网卡AP模式为wifi热点

1、判断网卡是否支持AP 不管是自带无线网卡、还是外接的usb无线网卡&#xff0c;要先配置为AP热点模式。需要看检查是否支持AP模式。 例如&#xff0c;这里插入 rtl8811c 的双频usb无线网卡&#xff0c;iwconfig查看网卡信息 nvidianvidia-desktop:~$ iwconfig wlan0 un…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…

GD32F303 DAM串口接收

1.设置串口 串口配置比较常规&#xff0c;我只应用的空闲中断。 2.DMA设置 我设置的DMA是串口接收到数据后保存到数组里&#xff0c;数组满了以后会自动从头开始&#xff0c;并且会进入一次DMA中断。

Jenkins+Robot 接口自动化测试

目录 前言&#xff1a; 设计目标 项目说明 目录结构 配置 jenkins 1.安装插件 2.配置项目 前言&#xff1a; JenkinsRobot是一种常见的接口自动化测试方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;而Robot Framew…

代码随想录day3 | 203.移除链表元素 707.设计链表 206.反转链表

文章目录 一、移除链表元素的思想两种方法 二、203.移除链表元素三、707.设计链表四、206.反转链表 一、移除链表元素的思想 直接让前一个节点指向后一个节点即可 两种方法 第一种&#xff1a;直接删除 第二种&#xff1a;头删的时候&#xff0c;直接headhead->next 其实…

JAVA数据结构、集合操作及常用API_C++开发转JAVA

文章目录 零、引言一、JAVA数据结构基础1.0 数据类型概述1.1 基本数据类型 零、引言一、JAVA数据结构基础1.0 数据类型概述1.1 基本数据类型1.2 包装类1.3 基本类型和包装类型的区别1.4 包装类型的缓存机制1.5 equals() 和 1.6 自动装箱拆箱1.7 浮点数精度丢失1.8 数值、字符转…

windows下配置pytorch + yolov8+vscode,并自定义数据进行训练、摄像头实时预测

最近由于工程需要&#xff0c;研究学习了一下windows下如何配置pytorch和yolov8&#xff0c;并自己搜集数据进行训练和预测&#xff0c;预测使用usb摄像头进行实时预测。在此记录一下全过程 一、软件安装和配置 1. vscode安装 windows平台开发python&#xff0c;我采用vscod…

Python基础合集 练习26 (turtle库的使用)

turtle是标准库 import turtle as t 窗口最小单位为像素 t.steup(width,height,起始点,起始点) 不是必须的 t.setup(800, 400) 不设置后面的起始点默认在中间 空间坐标体系 绝对坐标 四个象限 t.goto(x,y) 让某个位置的海龟到达某个地方 t.goto(100,100) t.goto(10…

使用flask开启一个简单的应用

Flask是非常流行的 Python Web框架&#xff0c;它能如此流行&#xff0c;原因主要有如下几点: 。有非常齐全的官方文档,上手非常方便。 。有非常好的扩展机制和第三方扩展环境&#xff0c;.工作中常见的软件都会有对应的扩展。自己动手实现扩展也很容易。 。社区活跃度非常高。…

【可解释学习】PyG可解释学习模块torch_geometric.explain

PyG可解释学习模块torch_geometric.explain PhiloshopyExplainerExplanationsExplainer AlgorithmExplanation Metrics参考资料 torch_geometric.explain是PyTorch Geometric库中的一个模块&#xff0c;用于解释和可视化图神经网络&#xff08;GNN&#xff09;模型的预测结果。…