首页 > 其他分享 >希尔排序详解

希尔排序详解

时间:2024-07-12 13:56:21浏览次数:12  
标签:子集合 复杂度 希尔 详解 增量 排序 插入排序

文章目录

希尔排序原理

希尔排序(也称为缩小增量排序)采用的是分治的思想,设定一定的间隔,按照这个间隔将集合分成若干个子集合,然后对子集合进行排序;完成后减少这个间隔,再进行排序;逐渐减小这个间隔,直到完成间隔为1的这次排序,即完成集合的排序。
从另一个角度看,希尔排序是插入排序的一个优化。插入排序对于局部有序的集合有更高的排序性能。所以希尔排序前面的缩小间隔过程就是在使集合变得局部有序,最终间隔为1时即为插入排序

排序演示1

原数组:[-6,11,15,-4,1,-11,6,11,-11,2,16,-10,1,3,0,9],用希尔排序对这个长度为16的数组进行排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

排序演示2

原数组:[0,5,2,1,-1,11,1,-1,14,-2,10,13,3],用希尔排序对这个长度为13的数组进行排序
在这里插入图片描述
在这里插入图片描述

复杂度分析

时间复杂度

对于长度为n的集合,为它设置n/2的初始增量,该增量下分出n/2个长度为2或3的子集合,分别对它们进行插入排序;初始增量减半,变为n/22,该增量下分出n/2个长度为4或5的子集合,分别对它们进行插入排序;继续缩小增量,直到变为1。
对于增量n/2k的遍历,时间复杂度为:子集合个数n/2k * 单个子集合进行插入排序的时间O(2k/n)
增量为1,2,…,n/4,n/2的遍历时间累加,最终的时间复杂度约等于:O(n * log n)

空间复杂度

排序过程几乎未用到辅助空间,故空间复杂度为:O(1)

稳定性

排序过程会将不相邻的两个元素交换,有可能打乱两个相同元素之间原有的顺序,故希尔排序是不稳定的

标签:子集合,复杂度,希尔,详解,增量,排序,插入排序
From: https://blog.csdn.net/weixin_51372196/article/details/140323972

相关文章

  • linux 路由表详解
    MarkdownExamplelinux路由表详解通过route命令查看Linux内核的路由表:$routeKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIfacedefault_gateway0.0.0.0UG000p5p1......
  • Java中的递归算法详解
    Java中的递归算法详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是递归算法?递归算法是指在函数的定义中使用函数自身调用的方法。在算法中,递归通常用于解决可以被拆分为相似子问题的问题,每个子问题都是原始问题的一部分。2.递归算法的基本......
  • Java中的反序列化详解
    Java中的反序列化详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是反序列化?反序列化是将对象的字节序列转换回对象的过程。在Java中,对象序列化是将对象转换为字节序列以便存储或传输,而反序列化则是将这些字节序列重新转换为对象。2.Java中......
  • Java中的排序算法详解
    Java中的排序算法详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.排序算法概述排序算法是计算机科学中的基础问题,它将一组元素按照特定的顺序重新排列。在实际开发中,选择合适的排序算法可以显著提高程序的性能。2.冒泡排序(BubbleSort)冒泡排序......
  • 异步请求技术--Ajax(教你彻底学会Ajax,关键细节,原生Ajax,应用案例详解,最易懂图文讲解!!! 建
    1.什么是Ajax1.AJAX即"AsynchronousJavascriptAndXML"(异步JavaScript和XML)2.Ajax是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术Ajax在线3文档 重点是XHR创建XHR请求XHR响应!等1.1 一图胜千言 2.Ajax的通信原理......
  • 经典再现,回顾常见排序算法之冒泡排序,附Java源码及优化改进实现
    回顾一下排序算法,老酒装新瓶,给自己的技能点做个回放。排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个有序的序列,也可以理解为高矮个站队。衡量排序算法的两个指标,时间复杂度和稳定性。举个例子,如果我们的数据......
  • Java中的枚举类型详解
    Java中的枚举类型详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,枚举类型(enum)是一种特殊的数据类型,它允许变量定义为预定义的常量集合。枚举在Java中非常有用,特别是当需要一组固定的常量时,如方向(北、东、南、西)、颜色(红、绿、蓝)等。本文将详......
  • Java中的接口和抽象类详解
    Java中的接口和抽象类详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java编程中,接口和抽象类是非常重要的两个概念,它们在面向对象编程中起着关键作用。本文将详细介绍接口和抽象类的定义、使用方法以及它们之间的区别。1.接口的定义和使用接口......
  • Python实战Elasticsearch的核心技巧详解
    概要Elasticsearch是一个分布式的搜索引擎,可以用于全文搜索、结构化搜索、分析等多种场景。它基于Lucene构建,提供了强大的搜索功能和数据分析能力。本文将详细介绍如何使用Python实现与Elasticsearch的交互,包括安装、配置、基本操作和实际应用示例。安装和配置安装Elast......
  • Python UDP编程之实时聊天与网络监控详解
    概要UDP(UserDatagramProtocol,用户数据报协议)是网络协议中的一种,主要用于快速、简单的通信场景。与TCP相比,UDP没有连接、确认、重传等机制,因此传输效率高,但也不保证数据的可靠性和顺序。本文将详细介绍Python中如何使用UDP协议进行网络通信,并包含相应的示例代码,帮助全面掌......