概要

-IDE:Pycharm
-Python版本:python3.x
-算法分类:内部排序->插入类排序->希尔排序

算法思想

希尔排序又称缩小增量排序法,是一种基于插入思想的排序方法。它利用了直接插入排序的最佳性质,首先,将待排序的关键字序列分成若干个较小的序列,对子序列进行直接的插入排序,使整个待排序列排好序。
过程如下:
1.首先选定记录间的距离di(i=1)di(i=1)d_i(i=1),在整个待排序记录序列中将所有间隔为d1d1d_1的记录分成一组,进行组内直接插入排序。
2.然后选取i=i+1i=i+1i=i+1,记录间的距离为di(di<di−1)di(di<di−1)d_i(d_i,在整个待排序记录序列中,将所有间隔为didid_i的记录分成一组,进行组内直接插入排序。
3.重复步骤2直至记录间的距离di=1di=1d_i=1,此时整个只有一个子序列,对该序列进行直接插入排序,完成整个排序过程。

算法要点

增量取法

关于增量ddd的取法,最初希尔提出取d=[n/2]" role="presentation" style="position: relative;">d=[n/2]d=[n/2]d=[n/2],再取d=[d/2]d=[d/2]d=[d/2],直到d=1d=1d=1为止。该思路的缺点是,奇数位置的元素在最后一步才会与偶数位元素进行比较,使得排序效率低。后来Knuth提出d=[d/3]+1d=[d/3]+1d=[d/3]+1。此外还有多种取法,但无法证明那种最优。

逆转数

为了分析希尔排序的优越性,这里引入逆转数的概念。对于待排序列中的某个记录的关键字,它的逆转数是指在它之前比此关键字大的关键字个数。
假设:被调换位置的两个关键字之间有lll个介于两个关键字之间的数。逆转数之和一定会减小2l+1" role="presentation" style="position: relative;">2l+12l+12l+1
当逆转数为000时则表明整个排序完成。

稳定性与时间复杂度

排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
希尔排序 不稳定 O(n1.5)" role="presentation" style="position: relative;">O(n1.5)O(n1.5)O(n^{1.5}) O(1)O(1)O(1)

Python代码清单

# !/usr/bin/python3
# _*_  coding:utf-8  _*_
# 希尔排序import random, time, sysdef SS(number,maxNumber):# 生成随机数timeStart = time.time()listA = [0]  # 0位 一般都空出来,防止out of index 或者做监视哨或者备份某个值。for i in range(number):listA.append(random.randint(0, maxNumber))  # 添加生成的值。timeEnd = time.time()timeIs = timeEnd - timeStartlistD = [0, int(number/2)]  # listD用于存放增量d,第0位用0占位,我们从第一位开始循环。while True:if listD[-1] != 1:  # 判断最后一个元素(增量)是否是1,若不是继续计算增量。listD.append(int(listD[-1]/3)+1)  # 计算增量else:break  # 若是1,则退出循环。print('生成%d个数的时间是%f' % (number, timeIs))# print(listA[1:])  # 从第一位开始输出。0位不显示。# print(listD[1:])  # 输出d的增量的列表##################################################### 希尔排序算法。  我认为 右边是前,左边是后。timeStart = time.time()  # 开始记录时间#  算法开始for d in listD[1:]:  # 设置循环的次数,与d有关系。base = 1 + d  # 从前向后找,从哦能通过d+1位开始。for item in range(base, len(listA)):  # 每次增加一位if listA[item] < listA[item-d]:  # 如果遇到前面小,后面大的数,listA[0] = listA[item]  # 复制前面的数aim = item-d  # 选定目标的位置。while True:  # 开始循环查询序列。if aim > 0 and listA[0] < listA[aim]:  # 这里应设置条件,以防无限循环。listA[aim + d] = listA[aim]  # 将选定目标位的数后移。aim = aim - d   # 每次向前查找,步长为delse:break  # 条件不符合 break 出listA[aim+d] = listA[0]  # 把目标值放入目标位。加d是因为在循环时多减了d。#  算法结束timeEnd = time.time()  # 记录结束时间。timeIs = timeEnd - timeStart  # 排序花费的时间print('排序%d个数,花费的时间是%f' % (number, timeIs))# print(listA[1:])  # 打印最后排序的列表。if __name__ == '__main__':helpInfo = '''This program is for Shell's Sort.How to use it! Follow the example!python Shell's_Sort.py 10 100The 10 representative will generate ten numbers.100 representative the max-number you make.'''command = sys.argv[0:]  # 获取从键盘输入的值。if len(command) != 3 or 'help' in command:  # 判断是否合法,或包含helpprint(helpInfo)  # 打印帮助文本。else:try:  # 尝试将输入转化为整数。number = int(command[1])maxNumber = int(command[2])except ValueError:  # 数值型错误。print(helpInfo)  # 打印帮助。sys.exit(1)  # 退出程序。SS(number, maxNumber)  # 一切完好,调用函数。

有什么问题请联系我

QQ:3116316431 (请附上信息)
E-mail:wongyinlong@yeah.net

数据结构之内部排序--希尔排序相关推荐

  1. 数据结构与算法之希尔排序

    数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...

  2. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

    独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...

  3. 【数据结构-排序】1. 图解插入排序三种实现(插入排序/折半排序/希尔排序)

    直接插入排序(插入排序) 排序思想 对于一个数组 A[0,n] 的排序问题,假设认为数组在 A[0,n-1] 排序的问题已经解决了. 考虑 A[n] 的值,从右向左扫描有序数组 A[0,n-1] ,直 ...

  4. 【每天学一点 - 算法篇 - 排序 - 希尔排序】

    系列文章目录 [每天学一点 - 算法篇 - 排序 - 插入排序] 文章目录 系列文章目录 前言 一.什么是希尔排序 二.原理 1.思路 2.示例 3.抽象 三.代码 四.复杂度 总结 前言 小时候听蛋 ...

  5. 算法---排序--希尔排序和快速排序

    冒泡.选择.插入排序算法是三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递 ...

  6. 排序---希尔排序实现和性能分析

    希尔排序 希尔排序是简单插入排序的改进,直接插入排序的最坏情况时间复杂度达到O(n^2),比如从大到小的一串数字654321,使用插入排序从小到大进行排序,这就达到插入排序的最坏情况. 希尔排序是把记 ...

  7. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

  8. 数据结构例程——插入排序之希尔排序

    本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef i ...

  9. 数据结构之八大排序——希尔排序

    直接插入排序算法的时间复杂度为O(),如果待排序的序列为"正序"时,时间复杂度为O(n),但是如果比较大的数字在第一个位置,那么进行排序的话需要一直移动到最后一位,比较适合基本有序 ...

最新文章

  1. C# Programming Language学习笔记(三)
  2. [网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施(CVE-2018-12613)
  3. SAP AET 框架是如何判断一个 SAP CRM UI 能否被扩展
  4. “云上企业”是企业面向未来的战略选择
  5. Java自引用造成的死循环
  6. Anti-AdBlock 反AdBlock
  7. onenote快捷键_onenote链接系列:链接笔记如何产生?与插入链接的区别
  8. 强悍的 Linux —— 文件解压与解压
  9. lambda表达式不使用委托(delegate) 用FUNC
  10. [原创]如何有效的考核测试人员
  11. linux查询电信端口,linux下获取电信,网通,铁通IP地址
  12. 【Java+JSP+MySql】12306购票系统(五)购买车票
  13. ubuntu下使用testerSunshine12306抢票程序
  14. Internet选项 添加信任站点
  15. 虚拟机和linux有啥关系,linux有什么虚拟机
  16. SSM框架和SSH框架的详细对比
  17. 计算机什么专业适合男生,内向的男生适合什么专业
  18. Linux系列——常用命令与shell函数总结
  19. Linux安装Nginx 作者:哇塞大嘴好帅
  20. 账号共享风险大 恐泄漏用户信息

热门文章

  1. 史上最小 x86 Linux 模拟器「GitHub 热点速览 v.22.50」
  2. 为什么国外程序员钟爱Mac?竟然是这个原因~
  3. ELO用户忠诚度评分建模
  4. Vue小项目Mock.js的学习
  5. sort、asort、ksort 三者说明
  6. 0元0基础搭建个人网站简易实操
  7. 2018年下半年教师资格证报考攻略
  8. IMS 呼叫流程简单分析
  9. HRBU 2021年暑期训练阶段三Day1
  10. 远程终端服务(3389)的安全配置方法,无需公网IP,3步实现外网访问远程桌面