描述

  希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

设计思想:  

  把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

图示

 

分析 

  初始时,有一个大小为 10 的无序序列。

  在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。

  接下来,按照直接插入排序的方法对每个组进行排序。

  在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。

  按照直接插入排序的方法对每个组进行排序。

  在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。

  按照直接插入排序的方法对每个组进行排序。此时,排序已经结束

  需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中,两个元素位置交换了

  所以,希尔排序是不稳定的算法。

代码实现

def get_number(num):import randomlst = []i = 0while i < num:lst.append(random.randint(0,100))i += 1return lstdef shellsort(lst):count = len(lst)step = 2  # 起始步长group = count // step  # 根据步长进行分组排序while group > 0:for i in range(0,group):j = i + groupwhile j < count:k = j - groupkey = lst[j]while k >= 0:if lst[k] > key:lst[k+group] = lst[k]lst[k] = keyk -= groupj += groupgroup //= step  # 取整数部分return lsta = get_number(10)
print("排序之前:",a)
b = shellsort(a)
print("排序之后:",b)####输出结果#########
排序之前: [71, 34, 15, 66, 36, 40, 2, 58, 33, 77]
排序之后: [2, 15, 33, 34, 36, 40, 58, 66, 71, 77]

性能分析

  算法稳定性:由上文的希尔排序算法演示图即可知,希尔排序中相等数据可能会交换位置,所以希尔排序是不稳定的算法。

  平均时间复杂度:O(Nlog2N)

  空间复杂度:O(1)

排序效果

转载于:https://www.cnblogs.com/vipchenwei/p/7106440.html

八大排序算法之希尔排序相关推荐

  1. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

  2. [算法]-排序算法之希尔排序

    希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...

  3. 排序算法:希尔排序算法实现及分析

    希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...

  4. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

  5. 排序算法之希尔排序(Java实现)

    希尔排序介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序基本思想 ...

  6. 排序算法(4)希尔排序

    排序算法(4)希尔排序 原理: 希尔排序也称缩小增量排序:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序, 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时(用gap ...

  7. php取名字算法,JavaScript排序算法之希尔排序的2个实例_基础知识

    插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率. 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位. 希尔排序按其设计者希尔(Donald Shell)的 ...

  8. 经典排序算法之希尔排序

    排序:希尔排序(算法) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序. 希尔排序是非稳定排序算法. 希尔排序因DL.Shell于1959 ...

  9. 常见排序算法之希尔排序

    文章目录 1.概述 2.希尔排序之交换法 3.希尔排序之移动法 4.测试案例 1.概述 由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率.希尔排序就是在这个基 ...

  10. 我的Java开发学习之旅------gt;Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

最新文章

  1. 不错的威盾PHP加密专家解密算法
  2. Windows上使用SecureCRT软件连接Linux终端 — 解决问题;The remote system refused the connection
  3. 把mysql部署在局域网的服务器上,远程连接mysql时报错误代码1130 Host ‘***.***.***.***’is not allowed to connect to this MySQL
  4. haproxy小结(一)基础概念篇
  5. java:彻底搞懂volatile关键字
  6. python的基本语术_一起学python-彻底掌握专业术语“变量”的概念
  7. 浙江大学PAT上机题解析之1008. 数组元素循环右移问题 (20)
  8. 基础省选+NOI-第2部分 数据结构进阶(II)
  9. P1255 数楼梯 方法二(python3实现)
  10. gateway动态路由_微服务中的网关技术:Gateway
  11. 【转】java线程池的原理和机制
  12. Python自定义模块
  13. 麟龙指标通达信指标公式源码_通达信麟龙指标套三主图+副图指标 贴图
  14. Python里面的编码问题真的让人快疯了.. Python乱码 b'\x1f\x8b\x08\x00\x00\x00\x00\x00\...'
  15. 大学我这样过,成了别人眼中的大神
  16. Android开发自学教程,安卓面试题及答案2022
  17. spring中使用Aspectj进行切面编程
  18. java url 图片路径_问个URL图片路径问题
  19. python画图大全_python画图教程
  20. 大年初五,2017年数据科学圈哪件事最令你激动?

热门文章

  1. build tut framework on ubuntu
  2. android volley post 参数,带有标题和正文的Android Volley POST请求
  3. 颜色矩特征提取matlab,求matlab彩色图片的颜色特征提取算法的代码,和纹理特征提取的? 爱问知识人...
  4. 台湾出境旅游项目数据分析
  5. kali数据库渗透_Kali Linux渗透测试实战 1.4 小试牛刀
  6. 为什么微博用jsoup爬取不出来东西_用Python爬取历年基金数据
  7. Vue底层判断标签的性能优化方法
  8. Android仿人人客户端(v5.7.1)——网络模块处理的架构
  9. 等效全向辐射功率(EIRP)
  10. linux下qemu共享文件夹,QEMU Windows来宾和Linux主机之间的共享文件夹