-
【算法】希尔排序及其Python实现
2019-10-05 11:06:44思路形象记忆: 代码实现要注意的地方 考虑极端情况; gap要记得int一下; 只要j小于gap,说明还可以向左走,所以j>=gap; 只要arr[j-gap]>tmp,说明需要向左走; 不是排完一个逻辑分组才去排另外一个,而是...希尔排序思想
有点类似归并可以分为两步:
(1)拆分; (2) 排序。并且不断重复这两个步骤。- 拆分:gap将数据拆成一个个小的逻辑小组,并且gap不断减少。一开始每个组最多只有2个元素,最后慢慢变成整体数据的一半,然后变成整体。而gap从一开始的int(len/2)最后变为2.
- 排序:对每个小组进行插入排序。
思路形象记忆:
其实就升级版插入排序,插入排序适用于小规模或基本有序,希尔排序融入分治的思想,用一个个小的插入排序去解决大规模、无序的问题。代码实现要注意的地方
- 考虑极端情况;
- gap要记得int一下;
- 只要j小于gap,说明还可以向左走,所以
j>=gap
; - 只要
arr[j-gap]>tmp
,说明需要向左走; - 不是排完一个逻辑分组才去排另外一个,而是同时的。每一组每组都优化一个数;
- 特点:其实就是在插入排序上多一个while循环判断gap。三个循环都与gap有关。
while gap>0
判断gap是否需要继续减半。
for i in range(gap, arr_len)
相当于选中插入排序时,准备插队的那个未排序数,而且这个i的特点是,轮流指向不同的逻辑分组,例如假设长度为8,gap=2时,此时有两个逻辑分组,i会分别取2,3,4,5,6,7。当i=2,4,6时,其实是对第一个逻辑分组进行插入排序(位置0即为第一个逻辑分组中默认已排序的初始值);当i=3,5,7时,其实是对第一个逻辑分组进行插入排序(位置1即为第二个逻辑分组中默认已排序的初始值)。
while j>=gap and arr[j-gap]>tmp
就是插入排序。j的判断值其实就是下面arr[j] = arr[j-gap]
中后面的变量arr[j-gap]
索引大于等于0的条件,即j-gap>=0
,故j>=gap
。(在插入排序中为j>=0
,因为插入排序中赋值的时候是arr[j+1] = arr[j]
,其实本质是一样的。插入排序代码)
代码
def shell_sort(arr): # 排序初始值 arr_len = len(arr) gap = int(arr_len/2) # 特殊情况考虑 if arr_len==0: return None if arr_len==1: return arr # 只要增量未减为0,则继续 while gap>0: for i in range(gap, arr_len): tmp = arr[i] j=i # 单组插入排序 # 只要j小于gap,说明还可以向左走 # 只要arr[j-gap]>tmp,说明需要向左走 while j>=gap and arr[j-gap]>tmp: # 比tmp大的值右移 arr[j] = arr[j-gap] # j减少增量值 j -= gap # 若找到最佳位置,则插入 # 因为一旦j大于gap则说明已经是最左边的数了,所以最佳位置就是j arr[j] = tmp # 每个逻辑分组都排序后,gap减半 gap = int(gap/2) return arr arr = [3,2,1,5,6,5] shell_sort(arr) print(arr)
参考:希尔排序–简单易懂图解
-
尹成Python27天入门到项目实战
2020-12-05 17:04:22python入门与学习方法精确思维与用到才能记忆深刻课程简介课前介绍计算机简介与硬盘概念内存作用计算机小结编程语言简介操作系统简介python版本简介切换python版本修改环境变量交互式编程两种风格python3代码保存... -
易佳工艺软件
2012-04-11 19:56:571. 输入法记忆功能,在尺寸编辑器中,尺寸名称的输入法具有记忆功能。 2010/1/10 11.0.3.0 1. 夹条文字上有乱码。 2010/1/10 10.9.9.1 1. 码号之间切换速度慢的问题。 2010 新年快乐! 2009/12/30 10.9.8.4 1.... -
MATLAB通信仿真及应用实例详解(附超星阅读器)
2018-09-05 17:07:505.5.6 无记忆非线性模块 149 第6章 信源编码 153 6.1 压缩和扩展 153 6.1.1 A律压缩模块 153 6.1.2 A律扩展模块 154 6.1.3 μ律压缩模块 155 6.1.4 μ律扩展模块 156 6.2 量化和编码 157 6.2.1 抽样量化编码器 157 ... -
《Java Web开发实战1200例(第I卷)》(清华出版.卢瀚.王春斌).part2 高清完整PDF版
2016-06-13 12:06:47实例037 foreach循环优于for循环 实例038 终止循环体 实例039 循环体的过滤器 实例040 循环的极限 2.5 常用排序 实例041 冒泡排序法 实例042 快速排序法 实例043 选择排序法 实例044 插入排序法 实例045 ... -
MATLAB通信仿真及应用实例详解pdf-MATLAB通信仿真及应用实例详解.part1.rar
2019-08-12 20:09:295.5.6 无记忆非线性模块 149 第6章 信源编码 153 6.1 压缩和扩展 153 6.1.1 A律压缩模块 153 6.1.2 A律扩展模块 154 6.1.3 μ律压缩模块 155 6.1.4 μ律扩展模块 156 6.2 量化和编码 157 6.2.1 ... -
MATLAB通信仿真及应用实例详解pdf-MATLAB通信仿真及应用实例详解.part2.rar
2019-08-12 20:09:405.5.6 无记忆非线性模块 149 第6章 信源编码 153 6.1 压缩和扩展 153 6.1.1 A律压缩模块 153 6.1.2 A律扩展模块 154 6.1.3 μ律压缩模块 155 6.1.4 μ律扩展模块 156 6.2 量化和编码 157 6.2.1 ... -
MATLAB通信仿真及应用实例详解pdf-MATLAB通信仿真及应用实例详解.part4.rar
2019-08-12 20:10:035.5.6 无记忆非线性模块 149 第6章 信源编码 153 6.1 压缩和扩展 153 6.1.1 A律压缩模块 153 6.1.2 A律扩展模块 154 6.1.3 μ律压缩模块 155 6.1.4 μ律扩展模块 156 6.2 量化和编码 157 6.2.1 ... -
MATLAB通信仿真及应用实例详解pdf-MATLAB通信仿真及应用实例详解.part7.rar
2019-08-12 20:11:095.5.6 无记忆非线性模块 149 第6章 信源编码 153 6.1 压缩和扩展 153 6.1.1 A律压缩模块 153 6.1.2 A律扩展模块 154 6.1.3 μ律压缩模块 155 6.1.4 μ律扩展模块 156 6.2 量化和编码 157 6.2.1 ... -
MATLAB通信仿真及应用实例详解pdf-MATLAB通信仿真及应用实例详解.part3.rar
2019-08-12 20:09:525.5.6 无记忆非线性模块 149 第6章 信源编码 153 6.1 压缩和扩展 153 6.1.1 A律压缩模块 153 6.1.2 A律扩展模块 154 6.1.3 μ律压缩模块 155 6.1.4 μ律扩展模块 156 6.2 量化和编码 157 6.2.1 ... -
软件工程师典藏:C#程序开发范例宝典(第2版).part01
2012-11-11 20:05:51实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动控件 141 实例... -
C#程序开发范例宝典(第2版).part02
2012-11-12 07:55:11实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动控件 141 ... -
C#程序开发范例宝典(第2版).part13
2012-11-12 20:17:14实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动控件 141 ... -
C#程序开发范例宝典(第2版).part08
2012-11-12 08:04:21实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动控件 141 ... -
C#程序开发范例宝典(第2版).part03
2012-11-12 07:56:38实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动控件 141 ... -
程序开发范例宝典>>
2012-10-24 10:41:28实例178 带记忆功能的MP3播放器 254 实例179 自动播放的MP3播放器 257 实例180 学校体操定时音乐播放 258 实例181 播放系统自带的事件声音 259 实例182 获取MP3文件的歌词 260 实例183 M3U文件的... -
书 名:程序开发范例宝典>>【中卷】(分三卷上传完本书案例)
2010-04-05 21:59:37实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动... -
书 名:程序开发范例宝典>>【下卷】(分三卷上传完本书案例)
2010-04-05 03:24:09实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 140 实例098 程序运行时拖动... -
Delphi开发范例宝典目录
2014-03-07 10:24:25实例048 程序在循环中响应界面操作 57 实例049 使用任意组件拖动窗体 58 实例050 动态创建窗体和释放窗体 59 实例051 修改提示字体及颜色 60 1.14 其他技术 61 实例052 窗口融合技术 61 实例053 给MDI... -
delphi 开发经验技巧宝典源码
2010-08-12 16:47:230232 设计带记忆的数据录入窗口 154 0233 在窗体关闭时提示有未保存的数据 155 0234 设置只允许3次密码错误 156 0235 如何读取Word中的文本 156 0236 通过身份证号获取年龄 157 0237 如何实现一个应用... -
iPhone开发秘籍(第2版)--源代码
2012-12-11 13:51:222.12.3 记忆标记 59 2.12.4 折叠方法 60 2.13 针对发布进行构建 60 2.14 清除构建 61 2.14.1 针对App Store进行编译 62 2.14.2 调试App Store上传 63 2.15 针对临时发布进行构建 64 2.15.1 注册设备 64 ... -
C#编程经验技巧宝典
2008-06-01 08:59:3316 <br>0033 Return语句的使用 17 <br>0034 如何实现无限循环 17 <br>0035 巧用foreach语句控制控件 18 <br>0036 有效使用switch case语句 18 <br>2.3 运算符 19 <br>0037 如何使用... -
php高级开发教程说明
2008-11-27 11:39:22这个循环也许用不了1 0 0行代码,但是为一个优化的循环选择设计一个优化的算法很容易耗费一 整天的时间,这个小小的循环也许是设计阶段最庞大的部分,但另一方面,你可以在不到一天 的时间内策划好数千行的代码。 ... -
易语言程序免安装版下载
2011-04-07 09:28:50修改集成开发环境,自动记忆非独立编译时是否写出依赖文件的选项。 6. 大幅提高编译速度。 对其它支持库的更新: 1. 修改高级表格支持库,在双击单元格进入编辑状态后,不能收到第一个“字符输入”事件的BUG。 ...
收藏数
24
精华内容
9
-
MikroTik-RouterOS-6.45.6.1.ova
-
MySQL 主从复制 Replication 详解(Linux 和 W
-
php复习题
-
OLED显示屏简单介绍
-
if(!a)的含意
-
weblogs_hbase.txt
-
MySQL 事务和锁
-
基于微信的同城小程序、校园二手交易小程序 毕业设计毕设源码使用教程
-
基于区块链的数据透明化问题与挑战
-
修改putty颜色
-
打卡第一日
-
2017年华东师范大学839数据结构考研真题
-
Nginx 常用的命令
-
区块猫区块龙猫猫乐园宠物区块链页面超大气可封装.zip
-
Python字符串逆序输出
-
玩币居士3.4比特币高压多头上攻受阻 空头持续来袭 后市如何操作
-
Jmeter在Linux下的运行测试
-
可用于反查贷款利率的贷款计算器
-
libFuzzer视频教程
-
2021年软考系统规划与管理师-上午历年真题解析视频课程