算法04-希尔排序

希尔排序(Shell Sort)

希尔排序是插入排序的改进版,通过分组插入排序的方式逐步缩小分组间隔,最终完成整个数组的排序。它的核心思想是让数组中任意间隔为h的元素有序,随着h的减小,数组逐渐趋于全局有序。


算法原理

  1. 分组插入排序

    • 选择一个增量序列(例如 h = n/2, n/4, ..., 1),将数组分成若干子数组,每个子数组包含间隔为h的元素。
    • 对每个子数组进行插入排序。
  2. 逐步缩小增量

    • 每次缩小增量h,重复分组和插入排序的过程,直到h=1。
    • 当h=1时,整个数组被当作一个子数组进行插入排序,此时数组已经基本有序,插入排序的效率很高。

算法步骤

  1. 选择一个增量序列(例如 h = n/2, n/4, ..., 1)。
  2. 对于每个增量h:
    • 将数组分成若干子数组,每个子数组包含间隔为h的元素。
    • 对每个子数组进行插入排序。
  3. 重复上述步骤,直到h=1,完成最后一次插入排序。

示例

假设数组为 [8, 3, 5, 1, 4, 7, 6, 2],增量序列为 [4, 2, 1]

第1轮(h=4):

  • 将数组分成4个子数组:
    • 子数组1:[8, 4]
    • 子数组2:[3, 7]
    • 子数组3:[5, 6]
    • 子数组4:[1, 2]
  • 对每个子数组进行插入排序:
    • 子数组1:[4, 8]
    • 子数组2:[3, 7]
    • 子数组3:[5, 6]
    • 子数组4:[1, 2]
  • 排序后的数组:[4, 3, 5, 1, 8, 7, 6, 2]

第2轮(h=2):

  • 将数组分成2个子数组:
    • 子数组1:[4, 5, 8, 6]
    • 子数组2:[3, 1, 7, 2]
  • 对每个子数组进行插入排序:
    • 子数组1:[4, 5, 6, 8]
    • 子数组2:[1, 2, 3, 7]
  • 排序后的数组:[4, 1, 5, 2, 6, 3, 8, 7]

第3轮(h=1):

  • 将整个数组当作一个子数组进行插入排序:
    • 排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8]

代码实现

def shell_sort(arr):n = len(arr)# 初始增量hh = n // 2while h > 0:# 对每个子数组进行插入排序for i in range(h, n):temp = arr[i]j = i# 插入排序的核心逻辑while j >= h and arr[j - h] > temp:arr[j] = arr[j - h]j -= harr[j] = temp# 缩小增量h //= 2return arr# 示例
arr = [8, 3, 5, 1, 4, 7, 6, 2]
print(shell_sort(arr))  # 输出: [1, 2, 3, 4, 5, 6, 7, 8]

时间复杂度

  • 最好情况:O(n log n)(当数组已经有序时)

  • 最坏情况:O(n²)(取决于增量序列的选择)

  • 平均情况:O(n log n) ~ O(n²)

空间复杂度

  • O(1)(原地排序)

稳定性

  • 不稳定(相同元素可能被分到不同的子数组,导致相对顺序改变)

优缺点

优点:

  • 比插入排序更快,尤其是对中等规模的数据。

  • 实现简单,代码量少。

缺点:

  • 时间复杂度依赖于增量序列的选择。

  • 不稳定。


适用场景

  • 中等规模的数据排序。

  • 对稳定性要求不高的场景。

总结

  • 希尔排序通过分组插入排序的方式,逐步缩小增量,最终完成排序。
    它的时间复杂度介于O(n log n)和O(n²)之间,适合中等规模的数据排序。
    虽然不稳定,但在实际应用中表现良好。

© 著作权归作者所有

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 统一功能处理之拦截器、数据返回格式、异常处理

目录 拦截器 一、什么是拦截器 二 拦截器的使用 三 拦截路径配置 四 拦截器的执行流程 统一数据返回格式 统一异常处理 拦截器 一、什么是拦截器 拦截器是Spring框架提供的核心功能之一,主要用来拦截用户的请求,在指定方法前后,根据业务…

Django学习笔记(第一天:Django基本知识简介与启动)

博主毕业已经工作一年多了,最基本的测试工作已经完全掌握。一方面为了解决当前公司没有自动化测试平台的痛点,另一方面为了向更高级的测试架构师转型,于是重温Django的知识,用于后期搭建测试自动化平台。 为什么不选择Java&#x…

Spring Cloud工程完善

目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

Linux ftrace 内核跟踪入门

文章目录 ftrace介绍开启ftrace常用ftrace跟踪器ftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find wh…

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现 权限系统分类(RBAC)引言菜单权限按钮权限接口权限路由权限 菜单权限方案方案一:菜单…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名, 不仅仅是公私钥签名,还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式,可以基于字节范围进行计算,也可以基于Pdf 对象(pdf object)进行计算。 PDF文件可能包…

CSS3+动画

浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程,css3中的属性进展都不一样,浏览器厂商在标准尚未明确的情况下提前支持会有风险,浏览器厂商对新属性的支持情况也不同,所有会加厂商前缀加以区分。如果某个属性…

微信小程序分包异步化

分包1引入分包2的组件或者js 引入组件: 主包里的pages/tabbars/tabbar1/tabbar1页面 引入分包sub1的sub1/components/sub1-component/sub1-component组件 1、分包预下载 首先在app.js定义preloadRule "preloadRule": {"pages/tabbars/tabbar1/tabb…

后端java工程师经验之谈,工作7年,mysql使用心得

mysql 工作7年,mysql使用心得 mysql1.创建变量2.创建存储过程2.1:WHILE循环2.2:repeat循环2.3:loop循环2.4:存储过程,游标2.5:存储过程,有输入参数和输出参数 3.三种注释写法4.case …

基于 GEE 利用插值方法填补缺失影像

目录 1 完整代码 2 运行结果 利用GEE合成NDVI时,如果研究区较大,一个月的影像覆盖不了整个研究区,就会有缺失的地方,还有就是去云之后,有云量的地区变成空值。 所以今天来用一种插值的方法来填补缺失的影像&#xf…

unity学习34:角色相关3,触发器trigger,铰链 hingejoint 等 spring joint, fixed joint

目录 1 触发的实现条件 1.1 碰撞的的实现条件 1.2 触发的实现条件 1.3 触发器trigger,直接拿 碰撞器collider修改下配置即可 2 触发器相关实验:触发开门效果 2.0 目标 2.1 player物体的属性 2.2 新建一个trigger 物体 2.3 新建一个被trigger 控…

(1/100)每日小游戏平台系列

每日小游戏平台 项目简介以及地址 准备开发一个一百天小游戏平台,使用Flask构建的简单游戏导航网站,无需登录,让大家在返工的同时也可以愉快的摸鱼玩耍。 每天更新一个小游戏上传,看看能不能坚持一百天。 这些小游戏主要使用前端…

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1)Rook Operator2)Rook Discover3)Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建,安装nodejs即可 参考:https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…

DeepSeek做赛车游戏

赛车模型 2D生成图片 任意AI图片软件SD,MJ 图片生成3D模型 车身 车轮 场景 Rodin,Tripo和Meshy 询问deepSeek如何开发 拷贝代码 将汽车运行代码拖到汽车上 再让AI写个摄像头跟随代码 再去提问deepseek控制轮胎和一些处理细节

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。一般来说,…

亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动

背景知识 手指检测:亚博microros小车-原生ubuntu支持系列:4-手部检测-CSDN博客 程序功能说明 功能开启后,摄像头捕获图像,识别手势来控制小车移动。 手势 “5”小车前进拳头小车后退手势 “1”小车向左手势 “2”小车向右 运…

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时,如果接口返回的是 List 类型的数据,可以通过以下方式处理: 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化,如果服务端返回的是 List的JSON格式数据,可以直接在 Feig…

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致

一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G,win内存24GB,不用担心可以打开,ma软件能够生成索引文件,逐块分析内存,如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…