希尔排序:优化插入排序的精妙算法

news2024/11/20 12:35:52

排序算法在计算机科学中扮演着重要的角色,其中希尔排序(Shell Sort)是一种经典的排序算法。本文将带您深入了解希尔排序,包括其工作原理、性能分析以及如何使用 Java 进行实现。

shellsort.jpg

什么是希尔排序?

希尔排序,又称“缩小增量排序”,是插入排序的一种改进版本。它的核心思想是通过逐步缩小增量值,将较大的元素向数组的一端移动,以减少逆序对的数量,从而提高整体的有序性。

希尔排序的关键步骤包括:

  1. 选择一个递减的增量序列,通常以 n/2 为初始增量,然后依次将增量减小为 n/4、n/8,直到增量为 1。
  2. 对于每个增量值,将数组分成若干个子序列,每个子序列使用插入排序进行排序。
  3. 不断减小增量值,重复步骤 2,直到增量值为 1,此时进行最后一次插入排序,完成排序过程。

shellsort.png

希尔排序的性能分析

希尔排序的性能分析相对复杂,因为它依赖于所选择的增量序列。以下是希尔排序性能的一般性分析:

  • 最坏情况时间复杂度

希尔排序的最坏情况时间复杂度取决于增量序列的选择。使用希尔增量序列时,最坏情况时间复杂度为$ O(n^2)$,与插入排序相同。但使用某些增量序列,如 Hibbard 或 Knuth 序列,最坏情况时间复杂度可以降低到 O ( n ( 3 / 2 ) ) O(n^(3/2)) O(n(3/2))

  • 平均情况时间复杂度

希尔排序的平均情况时间复杂度通常介于 O ( n ( 1.25 ) ) 到 O ( n 2 ) O(n^(1.25)) 到 O(n^2) O(n(1.25))O(n2) 之间,具体取决于增量序列的选择和数据分布。

  • 空间复杂度

希尔排序的空间复杂度为 O(1),因为它只需要常数级别的额外空间来存储增量、临时变量等。

  • 稳定性

希尔排序是不稳定的排序算法,因为在排序过程中,相等元素的相对顺序可能会发生改变。

Java 代码实现

public class Test {

    public static void main(String[] args) {
        int[] arr = new int[]{5,7,4,3,6,2};
        shellSort(arr);
    }

    public static void shellSort(int[] arr) {
        System.out.println("原始数组:"+ Arrays.toString(arr));
        //获取排序数组的长度
        int len=  arr.length;
        //初始化增量为 len/2
        int initGap = len >> 1;
        //count排序不使用,只是为了打印循环的次数,加深理解
        int count = 1;
        //循环处理,不断减小增量值,直到增量值为 1,此时进行最后一次插入排序,完成排序过程
        for(int gap = initGap; gap > 0; gap >>=1){

            // 对每个子序列进行插入排序
            for(int i = gap; i < len; i++){
                int temp = arr[i];
                int j = i;
                while (j >= gap && arr[j-gap] > temp ){
                    // 如果插入元素小于当前元素,则将当前元素后移一位
                    arr[j] = arr[j - gap];
                    //递减值为每次的增量
                    j -= gap;
                }
                //将目标元素插入到正确的位置
                arr[j] = temp;
            }

            // 打印每趟排序完成后的数组状态,以便查看排序进度
            System.out.println("第"+count+"趟排序完成的数组:"+ Arrays.toString(arr));
            count++;
        }

        System.out.println("排序完成的数组:"+ Arrays.toString(arr));
    }

}

运行结果:

原始数组:[5, 7, 4, 3, 6, 2]
第1趟排序完成的数组:[3, 6, 2, 5, 7, 4]
第2趟排序完成的数组:[2, 3, 4, 5, 6, 7]
排序完成的数组:[2, 3, 4, 5, 6, 7]

总结

希尔排序是一种优雅而高效的排序算法,尽管它相对于一些现代排序算法来说可能不够快,但它仍然具有重要的教育和历史价值。通过深入了解希尔排序的工作原理和实现方式,您可以更好地理解排序算法的核心原理,并在需要时选择适当的排序算法以提高程序性能。希望本文帮助您更好地理解希尔排序并激发您对排序算法的兴趣。

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

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

相关文章

数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【Java 进阶篇】深入了解JDBCTemplate:简化Java数据库操作

数据库操作是几乎所有现代应用程序的一部分。从存储和检索数据到管理业务逻辑&#xff0c;数据库操作是不可或缺的。在Java应用程序中&#xff0c;JDBCTemplate是一种强大的工具&#xff0c;可帮助开发人员轻松进行数据库操作。本文将深入探讨JDBCTemplate&#xff0c;了解它的…

【MySQL】基本查询 (一)

文章目录 一. 基础查询二. where条件子句三. NULL的比较结束语 操作如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chinese float default 0.0 comment…

怒刷LeetCode的第24天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;反向遍历 方法二&#xff1a;字符串操作函数 方法三&#xff1a;正则表达式 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;模拟 方法二&#xff1a;递归 方法三&#xff1a;迭代 方法四&…

VS Code更改软件的语言

刚刚安装好的 vscode 默认是英文&#xff0c;可以安装中文扩展包。如图&#xff1a; 重启即可更换为中文。 如果想切换为英文&#xff0c;可以 Ctrl Shift P&#xff0c;打开命令面板。 输入 Configure DIsplay Language&#xff0c;如图&#xff1a; 可以在中英文之间切换…

【C语言】什么是宏定义?(#define详解)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 ​ 目录 一.什么是宏定义 二.宏定义的组成 第1部分 第2部分 第3部分 三.宏定义的应用 &#x1f38f;类对象宏 &#x1f38f;类函数宏 1.求两个数中的较大值 2.求一个数的…

【短文】在Linux中怎么查看文件信息

2023年10月6日&#xff0c;周五晚上 ls -l filename 通过这条命令可以简略地查看文件信息 stat filename 通过这条命令可以详细地查看文件信息

NFS 原理和配置

NFS 原理介绍 NFS network file system 网络文件系统 基于RPC协议&#xff0c;RPC remote procedure call 。 RPC存在的意义在于解决NFS服务端和客户端通信多端口并且端口不固定的问题。因为NFS的服务端和客户端通信的时候&#xff0c;并不是只有一个端口&#xff…

【云计算网络安全】DDoS 缓解解析:DDoS 攻击缓解策略、选择最佳提供商和关键考虑因素

文章目录 一、前言二、什么是 DDoS 缓解三、DDoS 缓解阶段四、如何选择 DDoS 缓解提供商4.1 网络容量4.2 处理能力4.3 可扩展性4.4 灵活性4.5 可靠性4.6 其他考虑因素4.6.1 定价4.6.2 所专注的方向 文末送书《数据要素安全流通》本书编撰背景本书亮点本书主要内容 一、前言 云…

电脑提示MSVCP100.dll丢失错误怎么解决?分享四个解决方法帮你搞定

在平时我们使用电脑中&#xff0c;经常会遇到各种问题&#xff0c;比如msvcp100.dll文件丢失&#xff0c;那这个msvcp100.dll文件丢失需要怎么修复解决呢&#xff1f;和msvcp100.dll为什么会丢失呢&#xff0c;下面我一点点为大家解答与介绍解决msvcp100.dll丢失问题的方法。 一…

什么,这年头还有人不知道404

写在前面 哥&#xff0c;来帮我看看&#xff0c;这个请求怎么404了&#xff0c;明明接口路径是对的啊&#xff01;一个下午&#xff0c;组里的小哥突然让我帮忙看这个问题&#xff0c;我不禁一惊&#xff0c;啥&#xff0c;这年头了还有人搞不定404&#xff0c;如有还有&#…

【二】spring boot-设计思想

spring boot-设计思想 简介&#xff1a;现在越来越多的人开始分析spring boot源码&#xff0c;拿到项目之后就有点无从下手了&#xff0c;这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到&#xff0c;源码分为两个模块&#xff1a; spring-boot-project&a…

最强的电脑/手机/汽车/机器人芯片-2023

车规级芯片、手机芯片、电脑芯片比较_汽车芯片和电脑芯片的区别-CSDN博客 全文资源来源网络。 电脑&#xff1a; 图片引用。 CPU 基准测试性能层次结构根据性能对当前和上一代英特尔和 AMD 处理器进行排名&#xff0c;包括所有最适合游戏的 CPU。在 CPU 排名图表和表格下方&…

2023年【安全员-A证】报名考试及安全员-A证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新安全员-A证免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过安全员-A证作业考试题库很简单。 1、【多选题】2014年2月&#xff…

【亲测有效】C盘容量满了,给C盘扩容!!!

前言 相信有很多小伙伴用自己电脑的时候明明不往C盘装东西&#xff0c;但是C盘还是慢慢的变红了&#xff0c;我也是因为C盘满了而备受困扰。又不知道如何解决或者怕自己鼓捣着磁盘数据没了。闲来无事&#xff0c;我查了一些资料&#xff0c;终于将我的C盘容量扩充了且数据保存…

k8s-9 ingress-nginx

nodeport 默认端口 nodeport默认端口是30000-32767&#xff0c;超出会报错 添加如下参数&#xff0c;端口范围可以自定义 externalname ingress-nginx 通过一个外部的vip 地址 访问到集群内的多个service 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务&…

FLASH模拟EEPROM

STM32本身没有自带EEPROM&#xff0c;但是STM32具有IAP&#xff08;在应用编程&#xff09;功能&#xff0c;所以可以把它的FLASH当做EEPROM来使用。 STM32 FLASH简介 不同型号的STM32&#xff0c;其FLASH容量也有所不同&#xff0c;最大的达到1024K字节。 MiniSTM32开发板选…

打破思维局限性,产品背景、需求、功能实现逻辑手拿把掐!

在一个完整的测试流程中&#xff0c;测试用例是很核心的一个产出物。一份优秀的测试用例&#xff0c;能确保软件产品质量的可控。 但由于每个人思维局限性&#xff0c;对产品背景、需求、功能实现逻辑等理解深度不一致&#xff0c;编写的测试用例或多或少存在一些遗漏点&#…

C/C++学习 -- SHA-256算法

SHA-256算法概述 SHA-256代表"Secure Hash Algorithm 256-bit"&#xff0c;是一种安全的哈希算法&#xff0c;输出固定长度的256位&#xff08;32字节&#xff09;哈希值。SHA-256被广泛用于加密、数字签名、密码学以及区块链等领域&#xff0c;因为它提供了高度的安…

小程序如何关联视频号小店,实现商品同步

​随着短视频平台的兴起&#xff0c;视频号小店成为了很多商家推广产品和服务的新渠道。下面介绍如何将小程序与视频号小店关联起来&#xff0c;实现商品的同步。 1. 关联视频号小店。在小程序管理员后台->营销管理->视频号小店页面&#xff0c;点击双向箭头&#xff0c…