希尔排序(shell sort)是插入排序的一种,也称缩小增量排序,与普通的插入算法的区别就是gap步长。

希尔排序内层循环逻辑如下所示:

上面的可以分为4组,一个一个的按照插入算法来做,第一组有54 77 20三个元素,第二组是26 31两个元素,第三组是93和44两个元素,第四组是17和55两个元素。上面的可以分为4组,一个一个的按照插入算法来做,第一组有54 77 20三个元素,第二组是26 31两个元素,第三组是93和44两个元素,第四组是17和55两个元素。

上面的按照插入算法交换后较小的数在前面,较大的数在后面。

当gap=1的时候再次执行插入算法,如下所示:

希尔排序外层循环如下所示:

代码如下所示:

# coding:utf-8
def shell_sort(alist):"""希尔排序"""n=len(alist)gap = n // 2 #相除,因为涉及到/符号,所以又加了一个斜杠#print(gap) #4#gap变化到0之前,插入算法执行的次数#while gap>0:while gap >= 1:#print('gap值是',gap) #gap值是 4   gap值是 2    gap值是 1#下面的for循环是一个gap的情况,gap需求不断缩短,所以在外面又套了一层while的gap循环,上面的gap>0也可以写成gap>=1#插入算法,与普通的插入算法的区别就是gap步长#外层循环for j in range(gap,n):#j=[gap,gap+1,gap+2,gap+3,...,n-1]#print('外层循环值是',j)i = j#print('第一次',j,gap,n) #4 4 9# 先写内层循环while i>0:if alist[i] < alist[i-gap]:#print(i,gap,i-gap) #6 4 2  2 4 -2   8 4 4# print('666')# print(j,i, gap, i - gap) #6 6 4 2   6 2 4 -2   8 8 4 4    8 4 4 0alist[i],alist[i-gap] = alist[i-gap],alist[i]i-=gapelse:break#break;#break;#缩短gap步长gap //=2#print('gap除以2后的值是', gap) #gap除以2后的值是 2 gap除以2后的值是 1 gap除以2后的值是 0if __name__ == "__main__":li = [54, 26, 93, 17, 77, 31, 44, 55, 20]print(li)shell_sort(li)print(li)
"""
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]"""

另外一种实现方式如下所示:

# 创建一个希尔排序的函数
def shell_sort(alist):# 需要排序数组的个数N = len(alist)# 最初选取的步长gap = N // 2# 根据每次不同的步长,对分组内的数据进行排序# 如果步长没有减为1就继续执行#while gap > 0:while gap >= 1:# 对每个分组进行插入排序,# 因为插入排序从第二个元素开始,而这里第二个元素的下标就是gap# 所以j的起始点是gapfor j in range(gap, N): # 4 2 1这种,j的开始值是4,后来越来越小  2 1# 控制每个分组内相邻的两个元素,逻辑上相邻的两个元素间距为gap,# i的前一个元素比它少一个gap距离,所以for循环中j的步长为 -gapfor i in range(j, 0, -gap):# 判断和逻辑上的分组相邻的两个数据大小if alist[i] < alist[i - gap] and i - gap >= 0:# 交换temp = alist[i]alist[i] = alist[i - gap]alist[i - gap] = temp# 改变步长gap = gap // 2numlist = [5, 7, 8, 3, 1, 2, 4, 6, 9]
print("排序前:%s" % numlist)
shell_sort(numlist)
print("排序后:%s" % numlist)
"""
排序前:[5, 7, 8, 3, 1, 2, 4, 6, 9]
排序后:[1, 2, 3, 4, 5, 6, 7, 8, 9]
"""

python算法与数据结构-希尔排序算法相关推荐

  1. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  2. 【数据结构----笔记5】插入排序算法之【希尔排序算法】

    /*__________________________________________________________________________________________________ ...

  3. python实现希尔排序算法_python实现希尔排序算法

    希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...

  4. python算法与数据结构-选择排序算法(33)

    阅读目录 一.选择排序的介绍 二.选择排序的原理 三.选择排序的图解 四.选择排序总结 五.选择排序的python代码实现 六.选择排序的C语言代码实现 七.选择排序的时间复杂度 八.选择排序的稳定性 ...

  5. 算法与数据结构(排序算法概述)

    排序算法 Sort Algorithm 排序算法是将一系列数据根据指定的顺序进行排列的过程 排序算法的分类: 内部排序:指将需要处理的所有数据都加载到内存中进行排序 插入排序 直接插入排序 希尔排序 ...

  6. python算法与数据结构-选择排序算法

    代码如下所示: # 定义选择排序函数 def select_sort(list):# 计算需要排序的列表元素个数n = len(list)# 需要n-1次选择操作for j in range(n - ...

  7. java的 交换排序 快速排序算法_数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法...

    快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关. 升序排序: /** * 快速排序 * 升序排序 */ @Override public > void ...

  8. java 线性的排序算法_数据结构之排序算法Java实现(9)—— 线性排序之 基数排序算法...

    基数排序算法是计数排序的延伸,计数排序会造成很大的空间浪费,但基数排序法是对位数进行排序,适合于位数之间相差较大的情况,废话不多说,直接上代码: 升序排序法: /** * 基数排序法 * 升序排列 * ...

  9. python实现希尔排序_希尔排序算法的python实现

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. def shellSort(items): inc = len(items) / 2 wh ...

最新文章

  1. 在Marketplace上销售应用【WP7学习札记之十八】
  2. 【LeetCode笔记】200. 岛屿数量(Java、DFS)
  3. 自动化测试遇到的难点_浅谈软件测试质量目标以及如何去发现自动化测试的方向...
  4. 大数据时代,互联网企业应该如何搭建自己的BI系统?
  5. 人工智能在电力行业的应用,电力人工智能技术
  6. 金融壹账通冲刺港股:9个月亏10亿 半年前刚换帅
  7. groovy简单介绍
  8. crond和crontab详解
  9. YYH的营救计划(NOIP模拟赛Round 6)
  10. Markdown 插入目录索引、更改目录名称方法
  11. 企业即时通讯系统十大排名
  12. 时尚html输入框,12款经典时尚的HTML5应用
  13. 两圆的外切线与内切线的切点算法
  14. TikTok视频流量黄金发布时间
  15. 局域网计算机间的传输介质,计算机局域网知识点:传输介质
  16. Jquery 弹出对话框插件xcConfirm.js
  17. Kubernetes 学习总结(28)—— Kubernetes 常见问题总结
  18. 什么是checkpoint (转)
  19. 查看端口被占用的情况以及如何解除端口占用
  20. php多张图片切换效果,怎么把多张图片制作成gif动图 可设置图片切换效果及显示时间...

热门文章

  1. C语言ctype相关的几个函数
  2. python xlwt单元格合并_Python xlwt写入单元格并合并单元格操作问题,pythonxlwt,我想展示成这样:----...
  3. 13.8.可视化虚拟机工具--Jconsole内存监控、13.9.可视化虚拟机工具--Jconsole线程监控、13.10.死锁原理以及可视化虚拟机工具--Jconsole线程
  4. kill linux 信号量,kill用法详细解释(特别是信号量9的使用以及理解)
  5. idea maven打包_20201116(Maven学习)
  6. MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例
  7. 面试官:聊一下你对MySQL索引实现原理?
  8. Workshop | 超高效的设计方法你GET了吗?Design Sprint设计冲刺工作坊
  9. Spring Boot是什么
  10. Nagios监控之8:利用mutt+msmtp实现邮件报警