数据结构之内部排序--希尔排序
概要
-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代码清单
有什么问题请联系我QQ:3116316431 (请附上信息) |
数据结构之内部排序--希尔排序相关推荐
- 数据结构与算法之希尔排序
数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...
- 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...
- 【数据结构-排序】1. 图解插入排序三种实现(插入排序/折半排序/希尔排序)
直接插入排序(插入排序) 排序思想 对于一个数组 A[0,n] 的排序问题,假设认为数组在 A[0,n-1] 排序的问题已经解决了. 考虑 A[n] 的值,从右向左扫描有序数组 A[0,n-1] ,直 ...
- 【每天学一点 - 算法篇 - 排序 - 希尔排序】
系列文章目录 [每天学一点 - 算法篇 - 排序 - 插入排序] 文章目录 系列文章目录 前言 一.什么是希尔排序 二.原理 1.思路 2.示例 3.抽象 三.代码 四.复杂度 总结 前言 小时候听蛋 ...
- 算法---排序--希尔排序和快速排序
冒泡.选择.插入排序算法是三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递 ...
- 排序---希尔排序实现和性能分析
希尔排序 希尔排序是简单插入排序的改进,直接插入排序的最坏情况时间复杂度达到O(n^2),比如从大到小的一串数字654321,使用插入排序从小到大进行排序,这就达到插入排序的最坏情况. 希尔排序是把记 ...
- 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序
一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...
- 数据结构例程——插入排序之希尔排序
本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef i ...
- 数据结构之八大排序——希尔排序
直接插入排序算法的时间复杂度为O(),如果待排序的序列为"正序"时,时间复杂度为O(n),但是如果比较大的数字在第一个位置,那么进行排序的话需要一直移动到最后一位,比较适合基本有序 ...
最新文章
- C# Programming Language学习笔记(三)
- [网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施(CVE-2018-12613)
- SAP AET 框架是如何判断一个 SAP CRM UI 能否被扩展
- “云上企业”是企业面向未来的战略选择
- Java自引用造成的死循环
- Anti-AdBlock 反AdBlock
- onenote快捷键_onenote链接系列:链接笔记如何产生?与插入链接的区别
- 强悍的 Linux —— 文件解压与解压
- lambda表达式不使用委托(delegate) 用FUNC
- [原创]如何有效的考核测试人员
- linux查询电信端口,linux下获取电信,网通,铁通IP地址
- 【Java+JSP+MySql】12306购票系统(五)购买车票
- ubuntu下使用testerSunshine12306抢票程序
- Internet选项 添加信任站点
- 虚拟机和linux有啥关系,linux有什么虚拟机
- SSM框架和SSH框架的详细对比
- 计算机什么专业适合男生,内向的男生适合什么专业
- Linux系列——常用命令与shell函数总结
- Linux安装Nginx 作者:哇塞大嘴好帅
- 账号共享风险大 恐泄漏用户信息