希尔排序Shell Sort

Shell Sort

  1. 希尔排序是一种分组插入排序
  2. 首先取一个整数d1=n/2,n为列表长度,将元素分为d1个组,每组相邻量的元素之间距离为d1,在各组内进行直接插入排序
  3. 去第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序
  4. 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序,最后一趟排序使得所有数据有序

两个两个为一组,每组中的两个数的间隔是d1 = n//2,分好后从头开始看每一组两个数的大小关系,前小后大就不用交换,否则需要交换两个数的位置。这算第一趟排序。后续排序的间隔都为前一次的间隔整除二,直到间隔为1时,即为最后一次排序。

演示:

[6, 5, 9, 4, 7, 0, 1, 2, 3, 8] # 原列表,初始gap为10//2==5
# 从左开始遍历,(6,0),(5,1),(9,2),(4,3),(7,8),一个gap组,比较每组中两个数大小
# (6,0),(5,1),(9,2),(4,3),第一位都比第二位大,所以交换位置,(7,8)不用
[0, 1, 2, 3, 7, 6, 5, 9, 4, 8]
# 第二趟排序,gap=5//2=2,则比较的组有(0,2),(1,3),(2,7),(3,6),(7,5),(6,9),(5,4),(9,8)
# 可以看出,当gap变小时会出现两个组共同拥有同一个元素,如果前一个组合发生交换,那么后一个组合进行判断时,元素是要跟着前一个进行改变的
# 比如这里的(7,5)(5,4),第一个发生交换(5,7),后一个如果要比较就是比较(7,4),交换为(4,7)
# 因为交换后前面的组合就是(5,4),也需要交换,于是交换为(4,5)
# 又影响后面的组合(4,7)变为(5,7)
[0, 1, 2, 3, 4, 6, 5, 8, 7, 9]
# 第三趟排序,gap=2//2=1,两两比较交换,(6,5)(8,7),交换为(5,6)(7,8)
[0, 1, 2, 3, 4, 5, 6, 8, 7, 9]

因为希尔排序是一种分组的插入排序,所以我们可以由插入排序的代码,引入一个gap(间隔)参数来改编:

def Insert_sort_gap(list,gap):for i in range(gap,len(list)): temp = list[i]  # 存储摸到的牌,防止后续被覆盖j = i-gap  # 隔gap张牌while j >= 0 and list[j] > temp:list[j+gap] = list[j]  j -= gaplist[j+gap] = temp return list
  1. 假设手上有gap张牌(每一组的左边的牌在我们手上,有gap组),我们从第gap张牌开始摸。所以 i 从gap开始直到最后
  2. 插入排序是逐个比较,这个排序是与相隔gap个元素比较,所以 j = i-gap
  3. while循环,首先要保证指针要在列表内,所以是 j >= 0,逐个与temp值比较,直到把temp值放在一个适当的位置,比temp大的就往右移动,比temp小的就停在这个数的右边(隔gap个)。由上面的过程演示图可以知道,从左向右遍历,判断是否交换位置,在完成相邻gap的元素交换后,也要保持所有与该数有关的组合是有序的状态,否则需要继续调整。
  4. 主体代码:
def shell_sort(li):d = len(li) // 2 # 定义间距,也就是gapwhile d >= 1: # 间距不小于1时Insert_sort_gap(li,d) # 调用分组插入函数d //= 2  # 每次循环后,d整除2return li

以上就是一种希尔排序的完整代码,实际上希尔排序还有很多很多种实现方式

以下是我通过理解写的代码,感觉比较符合变化的步骤(有需要可以看看)

def shell_sort(li):gap = len(li)//2 # 确定gap的初始长度while gap >= 1: # 保证gap要不小于1,gap=1表示两元素相邻for i in range(gap, len(li)): # i指针j = i - gap # j指针while j >= 0: # 保证j在列表内if li[j] > li[i]: # 如果前大后小li[j], li[i] = li[i], li[j] # 交换两数i = j # 此时i指向此时的j位置j -= gap # j指向j-gap的位置# 此while循环,保证每次交换后,与前面的数都保持有序# 因为i是在for内的局部变量,在内层的while中修改,当跳出循环时,仍然可以正常执行gap //= 2 # 每次循环gap整除2return li

讨论

  1. 希尔排序的时间复杂度讨论比较复杂,并且和选取的gap序列有关,我们上面所演示的两种都是用n除2的k次方的形式实现,这种gap序列,在最坏情况下的时间复杂度是O(n的平方)
  2. 维基百科上搜gap序列,会有从诞生开始直到近代的所有gap序列以及对应的最坏时间复杂度的信息,有兴趣可以去看看

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

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

相关文章

数字孪生是如何通过接入VR和720等技术实现智慧楼盘的?

在当今智能化、数字化浪潮下,智慧楼盘逐渐成为房地产行业的发展趋势。数字孪生技术通过构建虚拟模型来映射真实楼盘,从而实现对建筑各项数据的实时监控、分析和预测。而当这一技术与VR(虚拟现实)和720全景等先进技术相结合时,智慧楼盘的应用效果便得到了进一步的提升,为业…

如何利用进销存系统,实现批次和保质期管理?

现在做食品、药品、化妆品、生鲜等行业,批次和保质期管理真是个大难题。 很多老板都遇到过这些问题:批次号乱七八糟 库存管理混乱 出问题找不到源头 人工管理容易出错这些问题,不仅让你亏钱,还可能让客户投诉、被市场监管盯上,甚至面临罚款。 怎么办?——用进销存系统!今…

Android的页面跳转

通过在antivity_xml设置按钮并添加属性 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width=&qu…

第1个服务-定时任务

第1个服务-定时任务 ​ 使用服务的流程: 部署,配置,优化/注意事项,排障,其他(监控,备份,日志,统一认证) ​ 定时任务格式配置 ​ 定时任务案例 ​ 同步时间 备份 终极挑战: 通过脚本取出系统指标,通过邮件发送出去 ​ 定时任务箴言 1.概述定时任务:用于执行在Linux…

第 3 课 - nRF Connect SDK 应用程序的元素 - 配置文件

根据开发者学院的描述,本节课程主要是了解NCS应用程序的结构,了解它们彼此之间的关系以及他们之间如何相互作用。 其中一些概念性的内容需要看官方的描述,我这里只对主要内容做一些总结。最小应用程序文件结构 app/ |-- CMakeLists.txt |-- Kconfig |-- prj.conf |-- <bo…

牛客题解 | 计算矩阵的特征值

牛客题库题解题目 题目链接 矩阵的特征值是指矩阵在某个方向上的拉伸倍数,数学表达式为: \[A \times v = \lambda \times v \]其中,\(A\) 为原矩阵,\(v\) 为特征向量,\(\lambda\) 为特征值。 在数学上,通常求解特征方程来求解特征值: \[det(A - \lambda I) = 0 \]但是,…

光伏龙头出海记:正泰新能易路如何用数字化HR破解全球化用工合规困局

2025开年,全球光伏领域组件供应商龙头企业——正泰新能科技股份有限公司(以下简称“正泰新能”)与易路人力资源科技(以下简称“易路”)合作携手,通过高效、智能、合规的HR数字化解决方案,拓展土耳其乃至全球的光伏市场,促进全球能源转型下的行业发展与技术创新。2025开…

Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音

一、前言 在音视频开发中,音量的控制分两块,一个是控制播放器本身的音量,绝大部分场景都是需要控制这个,这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量,因为播放器本身的音量是在系统音量的基础上控制的,也就是系统音量30%,意味着播放器最大的音量也是…

信息资源管理综合题之“四个的组织层次”

一、一个组织的运行一般包含战略层、管理层、知识层和操作层四个不同层次的内容,按照信息支持的不同层次,组织中信息系统可以分为六种不同类型,请将下表中序号(1)~(12)所对应的每种系统的中文名称及其对应的典型功能填写在答题卡相应位置处二、答案经理支持系统 长期销售…

如何在 Windows 上实现免密登录 Linux 服务器?

一、环境准备本地系统:Windows 10/11(需启用 OpenSSH 客户端)远程服务器:任意 Linux 发行版(需开启 SSH 服务)工具:系统自带 PowerShell 或 Git Bash(推荐)二、操作步骤 步骤 1:在 Windows 上生成 SSH 密钥对打开 PowerShell 或 Git Bash按 Win + S 搜索 "Power…

Cartesia 升级 TTS 模型,可在音频中无缝填充内容;索尼 AI 游戏角色原型:结合语音与动画,与玩家实时对话丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

NocoBase vs OutSystems:低代码平台,开源还是闭源?

开源 vs. 闭源,哪个低代码平台更适合你?NocoBase vs OutSystems 全面对比,揭示核心功能、成本和扩展性,帮你做出最佳选择!原文链接:https://www.nocobase.com/cn/blog/nocobase-vs-outsystems 引言 我在之前已经写过几篇产品深度对比文章,欢迎感兴趣的朋友前往阅读。Noc…