算法-排序算法:希尔排序(Shell Sort)【O(n^2)】

2024-09-02 03:18
文章标签 算法 排序 shell 希尔 sort

本文主要是介绍算法-排序算法:希尔排序(Shell Sort)【O(n^2)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

希尔排序(Shell Sort):1959年Shell发明,第一个突破O(n2)的排序算法,是插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序

一、希尔排序-算法描述:

先将整个待排序的序列A按照一个“增量”(gap)分割成为若干子序列,然后分别进行直接插入排序,具体算法描述:

  • 选择一个增量序列(gap 序列) t 1 , t 2 , … , t i , t j , … , 1 {t_1, t_2, …, t_i, t_j, …,1} t1,t2,,ti,tj,,1,其中ti>tj,此增量序列元素总数为n;
  • 按增量序列(gap序列)元素总数n,对序列进行n趟“直接插入排序”;
  • 每趟排序,根据对应的增量(gap=ti),将待排序列分割成若干长度为m 的子序列,分别对子序列进行直接插入排序。仅增量因子为1(gap=1) 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

二、希尔排序-过程分析

  • 在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这一系列增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。
  • 希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。
    在这里插入图片描述

三、希尔排序-动图演示

在这里插入图片描述
在这里插入图片描述

四、希尔排序-代码实现

def shell_sort(alist):n = len(alist)# 初始步长gap = n // 2while gap > 0:# 插入排序,与普通的插入排序的区别就是gap步长替代1for i in range(gap, n):j = i# 插入排序while j >= gap and alist[j - gap] > alist[j]:alist[j - gap], alist[j] = alist[j], alist[j - gap]j -= gap# 缩短gap步长,得到新的步长gap = gap // 2alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
shell_sort(alist)
print(alist)

五、希尔排序-时间复杂度

  • 最优时间复杂度:O(n1.3)
  • 最坏时间复杂度:O(n2) ,此时gap就直接取1
  • 稳定想:不稳定

这篇关于算法-排序算法:希尔排序(Shell Sort)【O(n^2)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128849

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快