python实现·十大排序算法之希尔排序(Shell Sort)

排序算法的优劣比较 排序算法的优劣比较,经过比较不同的数据量,进行不同的排序后的时间比较。 立即下载

简介

希尔排序(Shell Sort)属于插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。其基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。

算法实现步骤

  1. 选择一个增量序列 t 1 , t 2 , ⋯   , t k t_1,t_2,\cdots ,t_k t1​,t2​,⋯,tk​,其中 t k = 1 t_k=1 tk​=1(增量的取法: t i = n 2 i t_i=\dfrac{n}{2^i} ti​=2in​);
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序根据对应的增量 t i t_i ti​,将待排序列分割成若干长度为 m m m的子序列,分别对各子序列进行直接插入排序。当增量因子为1 时,整个序列作为一个序列来处理,排序完成。

Python 代码实现

# shell_sort 代码实现

from typing import List

def shell_sort(arr:List[int]):
    """
    希尔排序
    :param arr: 待排序的List
    :return: 希尔排序是就地排序(in-place)
    """
    length = len(arr)
    dist = length // 2
    
    while dist > 0:
        for i in range(dist, length):
            temp = arr[i]
            j = i
            while j >= dist and temp < arr[j-dist]:
                arr[j] = arr[j-dist]
                j -= dist
            arr[j] = temp
        dist //= 2
# 测试数据

if __name__ == '__main__':
    import random
    random.seed(54)
    arr = [random.randint(0,100) for _ in range(10)]
    print("原始数据:", arr)
    shell_sort(arr)
    print("希尔排序结果:", arr)
# 输出结果

原始数据: [17, 56, 71, 38, 61, 62, 48, 28, 57, 42]
希尔排序结果: [17, 28, 38, 42, 48, 56, 57, 61, 62, 71]

动画演示

希尔排序动画演示

算法分析

  • 时间复杂度

    当一开始为顺序时,效率最高,时间复杂度最好,为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2​n);当一开始为逆序时,效率最低,时间复杂度最坏,为 O ( n 2 ) O(n^2) O(n2)。希尔排序的时间复杂度是取决于增量的选取,用预不同的序列,时间复杂度可能不同,较快完成排序的平均时间复杂度为 O ( n 1.3 ) O(n^{1.3}) O(n1.3)。

  • 空间复杂度

    空间复杂度就是在交换元素时那个临时变量所占的内存空间,所以空间复杂度为 O ( 1 ) O(1) O(1)

  • 稳定性

    希尔排序需要进行多次插入排序,在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

  • 综合评价

    时间复杂度(平均)时间复杂度(最好)时间复杂度(最坏)空间复杂度排序方式稳定性
    O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n l o g 2 n ) O(nlog_2n) O(nlog2​n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)in-place不稳定

联系我们

个人博客网站:http://www.bling2.cn/

Github地址:https://github.com/lb971216008/Use-Python-to-Achieve

知乎专栏:https://zhuanlan.zhihu.com/Use-Python-to-Achieve
关注微信公众号【不灵兔】,获取更多资料

Sigrity XtractIM实战:5步搞定IC封装宽带模型提取(附BGA案例) 本文通过一个典型BGA封装案例,详细介绍了使用Cadence Sigrity XtractIM工具进行IC封装宽带模型提取的五步实战流程。内容涵盖从环境准备、参数设置、结果验证到模型导出的完整操作,重点阐述了如何利用XtractIM生成高精度、紧凑的宽带SPICE模型,以解决高速电路设计中因封装模型不准导致的信号与电源完整性问题,助力工程师提升仿真精度与设计效率。 阅读详情

相关推荐

史上最全的Logisim运算器实验教程(基于华中科技大学计算机组成原理实验)

本博客是实现了Logisim的运算器设计,有具体的运算器设计的思路和运算器设计的电路,适合一步一步的按照思路做。

qq_62325622的博客 4万+

算法篇-十大经典排序算法之冒泡排序

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。 什么是冒泡排序? 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。 冒泡排序的名称是根据数据规则来的,我们可以在冒泡排序中看到,数据在不断的推移,最终数据

xlecho的博客 444

如何用capl操控程控电源(RS232)

capl脚本操控RS232

xiaohuanxiong_的博客 3991

【算法基础】希尔排序解析

希尔排序由希尔(Donald Shell)在 1959 年所发表的论文“A high-speed sorting procedure”中提出,因此便以其名字进行命名。希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

NoBack7--For the dream 3927

在昇腾910B上,用kubeadm快速拉起一个双节点K8s集群(保姆级避坑指南)

本文详细介绍了在昇腾910B服务器上使用kubeadm快速搭建双节点Kubernetes集群的完整流程,包括环境准备、容器运行时配置、kubeadm初始化、节点加入与网络插件部署等关键步骤,特别针对ARM架构和昇腾芯片提供了优化配置和避坑指南。

weixin_29204749的博客 244

互联网金融项目实战(大数据Hadoop hive)

什么是互联网金融? 互联网金融 --> 信贷(信用贷款) --> 支付宝率先搞了一个信用体系 互联网金融: 在线支付、P2P 银行: 只会锦上添画、不喜欢雪中送炭 银行害怕出现坏账 ( 储户存钱,银行放贷 赚个利息差 ) 银行是可以倒闭的 保险公司不允许倒闭 银行分为:商业银行(自生自灭的)和非商业银行(国家的) 中国工商银行 全球第一大行 招商银行(清朝的一个李鸿章) 中国银行(历史超过 100 年了) 国家政策:希望银行能够扶持中小型企业 p2p:网络借贷平台 民间吸纳贷款 -->

weixin_58276266的博客 1553

常见的排序算法 - 希尔排序

希尔排序是一种比较有效的排序算法,它是插入排序的变种,能够提前发现序列中的逆序,减少比较次数,提高排序效率.然而,希尔排序不如快排或归并排序稳定,在排序稳定性有特殊要求的场景中,希尔排序不是很适用.希尔排序是一种插入排序的变种,它的基本思想是:将整个待排序的记录序列分割成若干子序列,分别进行直接插入排序。希尔排序是不稳定的。希尔排序的缺点是不稳定的,并且时间复杂度并不好确定,希尔排序的时间复杂度取决于增量序列的选取,如果增量序列不合理,希尔排序的时间复杂度可能会退化为O(n^2),甚至更劣。

ittuann的博客 527

ANPC三电平拓扑:两种调制方式解析

ANPC结构是基于“I”型NPC结构(下面讲NPC如不特殊说明,均指的是“I”型结构NPC)发展出来的一种改进型。我们在讲NPC结构的时候会谈到他的一个缺点就是损耗分布不均匀,会导致温升不均衡,进而限制模块的功率输出能力。而ANPC结构由于多了两个开关管以及相应的两个中性点换流回路(如下图),可以更加灵活任意的配置开关管可以使损耗没有那么的不均衡,从而能一定程度上提高模块的输出功率。ANPC拓扑结构图以及增加的环流回路。

IOTBOT的博客 9481

希尔排序

希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接插入排序不同的是,他会优先比较距离较近的元素。因此,希尔排序又叫做缩小增量排序。 1、算法思想 其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成。 希尔排序的实质就是分组的插入排序 2、优缺...

weixin_44656803的博客 632

安装matlab_Matlab+yalmip+cplex安装教程及算例

数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简...

weixin_28939637的博客 5005

uniapp(微信小程序) - 实现uniapp小程序电子签名板,横屏手写姓名签名专用写字画板,客户专用签字板,手写签名签字画板组件,手写签名,(详细运行示例,一键复制开箱即用)

uniapp实现微信小程序的电子签名效果,uniapp微信小程序 电子签名 写字板,用uniapp实现微信小程序的电子签名,uniapp微信小程序canvans实现手写签名,记录一个uniapp写的小程序的手写板,横屏,用于签名,unniapp实现电子签名,uniapp怎么做横屏的手写签名,uniapp如何实现签字板,uniapp小程序平台下怎么做电子签名板组件,uniapp电子签名插件,uniapp最好用的电子写字板插件组件源码,实现uniapp 手写签名功能,手写板、签字板,uni-app插件市场最好的

✅ 精选推荐文章 1万+

“希尔排序:打破时间瓶颈的排序算法 “

希尔排序,排序算法

虾米Life 940

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python希尔排序的优缺点_python实现·十大排序算法之希尔排序(Shell Sort)

简介希尔排序(Shell Sort)属于插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。其基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时...

weixin_39692037的博客 338

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

希尔排序增量的选取_python实现·十大排序算法之希尔排序(Shell Sort)

简介 希尔排序(Shell Sort)属于插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。其基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希...

weixin_32369749的博客 284

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python排序算法可视化 代码_python实现·十大排序算法之希尔排序(Shell Sort)

简介 希尔排序(Shell Sort)属于插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。其基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希...

weixin_39967120的博客 174

python实现【希尔排序】(Shell Sort)

python实现【希尔排序】(Shell Sort) 算法原理及介绍 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。 算法过程描述 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述: 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k

阿旭的博客 508

Python排序算法(五)——希尔排序(Shell’s Sort)

有趣的事,Python永远不会 如需转发,请注明出处:小婷儿的pythonhttps://www.cnblogs.com/xxtalhr/p/10793487.html 一、希尔排序(Shell’s Sort)   希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直...

小麦粒的Python 1068

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,由Donald Shell于1959年提出。它通过将数组分成若干子序列,并对每个子序列进行插入排序,逐步缩小子序列的间隔,最终完成整个数组的排序。

[Blog][Domain] programb.blog.youkuaiyun.com 1136

排序算法——希尔排序(Shell sort)【代码实现】

ActionScript function shellSort(data:Array):Array { var inc:uint = data.length/2; while(inc > 0) { for(var i:uint = inc; i< data.length; i++) { var tmp:Object = data[i]; for(var j:u...

数据联盟 3568

图解排序算法及实现——希尔排序 (Shell Sort)

希尔排序(ShellSort)也称增量递减排序算法,即跨多步版的InsertionSort,是InsertionSort基础上的改进版。InsertionSort可以看作ShellSort中gap=1的特例。希尔排序是非稳定排序算法。 希尔排序通过将全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是...

张渊猛的博客 7759

shell sort (希尔排序)

shell 全称Donald Shell, 在中国某度,几乎查不到该人的资料,然后去了Wikipedia 首段如下: Donald L. Shell(March 1, 1924 – November 2, 2015) was an Americancomputer scientistwho designed theShell sortsorting algorithm. He acquired hisPh.D.in Mathematics from theUniversity of C...

weixin_42183288的博客 633

python实现基本算法之希尔排序(Shell Sort)

基本算法之希尔排序(Shell Sort) 基本算法—09、希尔排序(Shell Sort)算法 。往期请看选择排序,插入排序,归并排序,快速排序等等都发布的!欢迎大家批评指正! 文章目录基本算法之希尔排序(Shell Sort)0、前言1、希尔排序算法是什么?2、算法过程图解3、代码实现4、评判算法 0、前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1、希尔排序算法是什么? 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,

Song_Of_Sea海歌同学的博客 624

希尔排序(Shell Sort)

将整个数组切按照一定的间隔取值划分为若干个子数组,每个子数组分别进行插入排序。然后逐渐缩小间隔进行下一轮划分子数组和对子数组进行插入排序。直至最后一轮排序间隔为。:在一次插入排序是稳定的,不会改变相等元素的相对顺序,但是在不同的插入排序中,相等元素可能在各自的插入排序中移动。因此,希尔排序方法是一种。希尔排序中用到的插入排序算法为原地排序算法,只用到指针变量。,对整个数组进行插入排序。以及表示无序区间中第。个元素的变量、间隔数。假设数组的元素个数为。

weixin_44245188的博客 900

十大排序、七大查找算法python实现——希尔排序(shell sort)

十大排序、七大查找算法python实现——希尔排序(shell sort) 原理参考链接:https://www.cnblogs.com/onepixel/articles/7674659.html 希尔排序的原理是,通过设定步长序列,将无序数组划分成不同的子数组,然后分别对子数组进行插入排序,随着步长的不断缩小,数组也逐渐变成有序。具体步骤如下: 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排

qq_36614831的博客 354

python 实现shell sort希尔排序算法

希尔排序(Shell Sort)是插入排序的一种高效的改进版本,也称为缩小增量排序。希尔排序的基本思想是将待排序的数组元素按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个文件恰被分成一组,算法终止。希尔排序的基本步骤可以归纳为以下几点:选择一个增量序列 t1, t2, …, tk,其中 ti > tj,tk = 1;按增量序列个数 k,对序列进行 k 趟排序;

luthane的博客 583
上一篇: python实现·十大排序算法之归并排序(Merge Sort)
下一篇: python实现·十大排序算法之堆排序(Heap Sort)
南风以南
博客等级 码龄10年 440粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风以南

如给您带来些许明朗,赏一杯香茗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值