当前位置: 首页 > news >正文

数据结构-希尔排序(Python)

目录

希尔排序算法思想

希尔排序算法步骤 

希尔排序代码实现 

希尔排序算法分析 


希尔排序算法思想

希尔排序(Shell Sort)基本思想

将整个数组切按照一定的间隔取值划分为若干个子数组,每个子数组分别进行插入排序。然后逐渐缩小间隔进行下一轮划分子数组和对子数组进行插入排序。直至最后一轮排序间隔为 1,对整个数组进行插入排序。

希尔排序算法步骤 

假设数组的元素个数为 n 个,则希尔排序的算法步骤如下:

  1. 确定一个元素间隔数 gap。
  2. 将参加排序的数组按此间隔数从第 1 个元素开始一次分成若干个子数组,即分别将所有位置相隔为 gap 的元素视为一个子数组。
  3. 在各个子数组中采用某种排序算法(例如插入排序算法)进行排序。
  4. 减少间隔数,并重新将整个数组按新的间隔数分成若干个子数组,再分别对各个子数组进行排序。
  5. 依次类推,直到间隔数 gap 值为 1,最后进行一次排序,排序结束。

我们以 [7,2,6,8,0,4,1,5,9,3] 为例,演示一下希尔排序的整个步骤。

<1>

<2>

<3>

<4>

<5>

<6>

<7> 

希尔排序代码实现 

class Solution:def shellSort(self, nums: [int]) -> [int]:size = len(nums)gap = size // 2# 按照 gap 分组while gap > 0:# 对每组元素进行插入排序for i in range(gap, size):# temp 为每组中无序数组第 1 个元素temp = nums[i]j = i# 从右至左遍历每组中的有序数组元素while j >= gap and nums[j - gap] > temp:# 将每组有序数组中插入位置右侧的元素依次在组中右移一位nums[j] = nums[j - gap]j -= gap# 将该元素插入到适当位置nums[j] = temp# 缩小 gap 间隔gap = gap // 2return numsdef sortArray(self, nums: [int]) -> [int]:return self.shellSort(nums)

希尔排序算法分析 

时间复杂度:介于 O(n×log⁡2n) 与 O(n*n) 之间。

  • 空间复杂度:O(1)。希尔排序中用到的插入排序算法为原地排序算法,只用到指针变量 i、j 以及表示无序区间中第 1 个元素的变量、间隔数 gap 等常数项的变量。

  • 排序稳定性:在一次插入排序是稳定的,不会改变相等元素的相对顺序,但是在不同的插入排序中,相等元素可能在各自的插入排序中移动。因此,希尔排序方法是一种 不稳定排序算法

相关文章:

  • Python格式化字符串的四种方法
  • Web Workers 技术详解与最佳实践
  • 【STM32 学习笔记】GPIO输入与输出
  • C++初学者的入门指南
  • Nginx核心功能2
  • 初始AI大模型-起源和发展
  • 解决DNS劫持问题
  • 7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测
  • 【KWDB 创作者计划】_Ubuntu 22.04系统KWDB数据库安装部署使用教程
  • 开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM(一)
  • 生成式AI服务内容被滥用的法律责任划分
  • 掌纹图像识别:解锁人类掌纹/生物识别的未来——技术解析与前沿数据集探索
  • 如何快速获取字符串的UTF-8或UTF-16编码二进制数据?数值转换成字符串itoa不是C标准?其它类型转换成字符串?其它类型转换成数值类型?
  • Java学习手册:Hibernate/JPA 使用指南
  • Python 矩阵运算:从理论到实践
  • 免费开源又全能,文件对比需求选他
  • (即插即用模块-Attention部分) 六十五、(2024 WACV) DLKA 可变形大核注意力
  • 方法:批量识别图片区域文字并重命名,批量识别指定区域内容改名,基于QT和阿里云的实现方案,详细方法
  • GGD独立站的优势
  • 如何判断cgroup的版本?
  • 陕西礼泉一村民被冒名贷款40余万,法院发现涉嫌经济犯罪驳回起诉
  • 机关食堂向游客开放的重庆荣昌区,“消费市场迎来历史性突破”
  • 俄军击落多架企图攻击莫斯科的无人机
  • 抗战回望18︱《广西学生军》:“广西的政治基础是青年”
  • 罗志田:文学革命的社会功能与社会反响
  • 本周看啥|《乘风》迎来师姐们,《天赐》王蓉搭Ella