算法-排序算法:希尔排序(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

相关文章

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Python中的sort()和sorted()用法示例解析

《Python中的sort()和sorted()用法示例解析》本文给大家介绍Python中list.sort()和sorted()的使用区别,详细介绍其参数功能及Timsort排序算法特性,涵盖自适应... 目录一、list.sort()参数说明常用内置函数基本用法示例自定义函数示例lambda表达式示例o

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

shell中set -u、set -x、set -e的使用

《shell中set-u、set-x、set-e的使用》本文主要介绍了shell中set-u、set-x、set-e的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录✅ 1. set -u:防止使用未定义变量 作用: 示例:❌ 报错示例输出:✅ 推荐使用场景:✅ 2. se

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、