希尔排序详解(Shell Sort)

news2024/9/20 18:40:48
本文已收录于专栏
《算法合集》

一、简单释义

1、算法概念

  希尔排序是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

2、算法目的

  把无序数组通过分组,分组之间比较进行移动,最后形成一个有序数组  (文中以升序为例)

3、算法思想

  先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2,以此类推。

二、核心思想

  1. –对已有的数列进行分组,明确增量;
  2. –每个分组使用直接插入排序进行位置交换;
  3. –将每个分组执行直接插入排序后的结果在进行直接插入排序;

三、图形展示

在这里插入图片描述
  1、第一次排序:首先明确第一次分组的增量值,用数组的的长度/2。6/2=3,将数组分为增量为3的三个分组,三个分组使用直接插入排序进行位置交换
在这里插入图片描述

  2、第二次排序:首先根据第一次的增量来计算第二次分组的增量,用第一次的增量/2得到第二次的增量,然后进行分组,分组完毕之后使用直接插入排序交换位置。
在这里插入图片描述

  3、第三次排序:首先根据第二次的增量来计算第三次分组的增量,直到增量为1进行最后一次的排序。

四、代码实现

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.InsertionSort
 * @Author: Wuzilong
 * @Description: 希尔排序
 * @CreateTime: 2023年5月1日
 * @Version: 1.0
 */

public class ShellSort {

    public static void main(String[] args) {
        int[] arr = {3, 5, 9, 2, 4, 7};
        System.out.println("排序之前数组:");
        System.out.println(Arrays.toString(arr));
        //希尔排序
        insertionSort(arr);

        System.out.println("希尔排序后数组:");
        System.out.println(Arrays.toString(arr));

    }

    private static int[]  insertionSort(int[] arr){
        if(arr == null || arr.length <= 1){
            return arr;
        }
        //希尔排序  升序
        for (int d = arr.length / 2;d>0;d /= 2){ //d:增量  7   3   1
            System.out.println("增量取值:" + d);
            for (int i = d; i < arr.length; i++){
                //i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标
                //j:代表与i同一组的数组元素角标
                for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界
                    if (arr[j] > arr[j + d]) {// j+d 代表即将插入的元素所在的角标
                        //符合条件,插入元素(交换位置)
                        swap(arr,j,j+d);
                    }
                }
            }
        }
        return arr;
    }

    public static void swap(int[] arr,int a,int b)
    {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

运行结果
在这里插入图片描述

五、算法描述

1、问题描述

  每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止

2、算法过程

整个算法过程分为以下几步:
  1)通过数组的长度/2得到第一趟排序的增量,按照增量进行分组。
  2)每个分组使用直接插入排序进行位置的交换
  3)通过第一趟排序的增量/2得到第二次排序的增量,向上取整,在按照增量进行分组
  4)每个分组使用直接插入排序进行位置的交换
  5)直到得到的增量为1时,进行的直接插入排序的结果为希尔排序的结果。

3、算法总结

  直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

六、算法分析

1、时间复杂度

  首先直接插入排序是一个稳定的排序算法;最好的情况下,也就是排序本身是有序的,共需比较n-1次,因为没有移动的记录,时间复杂度为O(n)。最坏的情况下,即排序表是逆序的情况,时间复杂为O(n²)。

2、空间复杂度

  算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数。在直接插入排序中只使用了i,j,temp这三个辅助空间单元,所以空间复杂度是O(1)。

3、算法稳定性

  由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

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

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

相关文章

【复杂网络建模】——Pytmnet进行多层网络分析与可视化

目录 一、Pymnet介绍 二、安装步骤 三、多层网络的构建 1、单层网络的构建 2、双层随机网络的构建和可视化 3、多路复用网络图的可视化 四、总结 一、Pymnet介绍 官网&#xff1a; Pymnet是一个用于网络分析和建模的Python库。它提供了各种网络分析工具&#xff0c;例…

shell的基础学习一

文章目录 一、shell的简介二、 Shell 变量三、Shell 传递参数总结 一、shell的简介 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供…

百胜中国:未来将实现强劲增长

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 收入分析与未来展望 在过去的三年里&#xff0c;百胜中国&#xff08;YUMC&#xff09;的收入一直受到疫情导致的旅行限制和封锁的影响。为了应对疫情造成的业务中断&#xff0c;该公司开始专注于外卖业务&#xff0c;并将…

中通快递财报预测:中通快递2023年收入和利润将大幅下降

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 市场对中通快递2023年的预测 卖方虽然预测中通快递&#xff08;ZTO&#xff09;在2023年的表现会很不错&#xff0c;但他们也预计中通快递今年的财务业绩将不会像去年那样好。 根据S&P Capital IQ的数据&#xff0c;卖…

【软考备战·希赛网每日一练】2023年5月1日

文章目录 一、今日成绩二、错题总结第一题第二题 三、知识查缺 题目及解析来源&#xff1a;2023年05月01日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 了解即可。 第二题 解析&#xff1a; 在序列基本有序时&#xff0c;快速排序基准元素起不到分…

第16章 变更管理

文章目录 16.1.2 项目变更的分类 50416.1.3 项目变更产生的原因 50516.2 变更管理的基本原则 50516.3 变更管理角色职责与工作程序 50616.3.1 角色职责 50716.3.2 工作程序 50716.4.1 变更管理操作要点 511 16.1 项目变更的基本概念 504 项目变更是指在信息系统项目的实施过程中…

【蓝桥杯】Python基础:经济基础决定上层建筑!

前言&#xff1a;今年4月第一次参加蓝桥杯比赛&#xff0c;选择的Python 研究生组赛道。在备赛过程中&#xff0c;发现经常会用到一些编程小技巧&#xff0c;因此笔者整理了一些蓝桥杯Python组编程基础常用的内容&#xff0c;以便日后备用。如果有小伙伴也觉得实用&#xff0c;…

1 对数器,二分查找,

文章目录 对数器二分查找**1. 有序序列二分查找****2. 在一个有序数组中&#xff0c;找<某个数最右侧的位置****3. 在一个有序数组中&#xff0c;找>某个数最左侧的位置****4. 无序序列二分查找 &#xff0c;求局部最小值** 对数器 对数器用于在自己的本地平台验证算法正…

百度、谷歌等搜索引擎高效搜索方法 —— 更快速搜索到你想要内容

一、常用搜索方法 1、限定标题 intitle 又被称为去广告搜索法&#xff0c;intitle命令&#xff0c;即in title&#xff08;在标题里&#xff09;返回的的结果是网页的标题包含该关键词。一般情况下搜索的关键词都会在标题里出现&#xff0c;使用intitle命令一般是在特殊需求下…

极乐迪斯科(风格) | Disco Elysium – Style LoRA

目录 What is this ❓How to use / 使用方法 &#x1f4dd;其他信息与参数: 模型演示&#xff08;多图预警&#xff09; 正面tag 负面tag What is this LoRA版本的极乐迪斯科风格模型, 使用共计15张图片, 分辨率为1024*1024, 用Anything v4.5训练. 其他模型没有经过测试,…

Linux之【多线程】生产者与消费者模型BlockQueue(阻塞队列)

生产者与消费者模型 一、了解生产者消费者模型二、生产者与消费者模型的几种关系及特点三、BlockQueue&#xff08;阻塞队列&#xff09;3.1 基础版阻塞队列3.2 基于任务版的阻塞队列3.3 进阶版生产消费模型--生产、消费、保存 四、小结 一、了解生产者消费者模型 举个例子&am…

计算机组成原理第五章(3)DMA处理

三种控制方式&#xff1a;程序查询程序中断DMA方式 回顾一下 之前的中断控制方式&#xff0c;如果是输入命令&#xff0c;先启动命令&#xff0c;通过地址总线选择相应的接口&#xff0c;通过地址译码之后的到选择电路&#xff0c;这个接口准备开始工作。 启动外部设备&#…

网络编程总结一:

一、网络基础&#xff1a; 概念&#xff1a;1> 网络编程的本质就是进程间的通信&#xff0c;只不过进程分布在不同的主机上 2>在跨主机传输过程中&#xff0c;需要确定通信协议后&#xff0c;才可以通信 1. OSI体系结构&#xff08;重点&#xff09; 定义7层模型&…

类和对象(上篇)【C++】

C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事拆分成不同的对象&#xff0c;靠对象之间的交互完成。 目录 一、类的定义 二、访问限定符…

【小样本分割 2020 TPAMI 】PFENet

文章目录 【小样本分割 2020 TPAMI 】PFENet1. 简介1.1 问题1) 高级特征误用造成的泛化损失2) 查询样本和空间样本之间的空间不一致 1.2 方法 2. 网络2.1 整体架构2.2 先验掩膜生成2.3 FEM模块 3. 代码 【小样本分割 2020 TPAMI 】PFENet 论文题目&#xff1a;Prior Guided Fea…

flinkCDC相当于Delta.io中的什么 delta.io之CDF

类似flink CDC databricks 官方文档: How to Simplify CDC With Delta Lakes Change Data Feed - The Databricks Blog delta.io 官方文档: Change data feed — Delta Lake Documentation 概述 更改数据馈送 (CDF) 功能允许 Delta 表跟踪 Delta 表版本之间的行级更改 在…

C语言函数与递归

目录&#x1f60a; 1. 函数是什么&#x1f43e; 2. 库函数&#x1f43e; 3. 自定义函数&#x1f43e; 4. 函数参数&#x1f43e; 5. 函数调用&#x1f43e; 6. 函数的嵌套调用和链式访问&#x1f43e; 7. 函数的声明和定义&#x1f43e; 8. 函数递归&#x1f43e; 1. 函…

二叉搜索树(内含AVL树的旋转操作的详细解释)

二叉搜索树 二叉搜索树的概念二差搜索树结构设计二叉搜索树的操作以及实现遍历判空插入查找删除(☆☆☆)二叉搜索树的其他方法 二叉搜索树的应用二叉搜索树的性能分析二叉树习题练习AVL树AVL树的概念AVL树的结构设计AVL树的插入(非常重要)AVL树的旋转(☆☆☆☆☆)AVL树的插入操…

基于STATCOM的风力发电机稳定性问题仿真分析(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

网页三剑客之 HTML

本章开始我们来介绍一下网页前端部分&#xff0c;我们只是简单的介绍一些常用的各种标签&#xff0c;其目的在于为我们后面的项目做准备。 我们并不要求能完全掌握前端的语法&#xff0c;但是在见到以后能够认识这些代码就可以了。 想走后端开发的&#xff0c;前端不需要多么…