Python sort原理

Python高阶函数-sorted(深度解析从原理到实战) sorted()是Python内置的高阶函数,用于对可迭代对象进行排序操作。与列表的sort()方法不同,sorted()会返回一个新的已排序列表,而不改变原数据。# 奇偶数优先排序:奇数在前,数值小的在前sorted()灵活的参数设计(特别是key函数)稳定的排序算法广泛的应用场景优秀的性能表现掌握sorted()的高级用法,可以让你写出更Pythonic、更高效的排序代码。建议在实际项目中多实践各种排序场景,深入理解其底层原理。扩展阅读:Python官方文档中关于排序指南的详细说明。 阅读详情

引言

sort内部实现:Timesort

最坏时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

空间复杂度: O ( n ) O(n) O(n)

内部实现原理的回答

  1. python sort 函数采用的排序算法_知乎:其中一个回答提到了 python 中的 sorted 排序内部实现是 timsort,并没有说 sort 。

  2. python的sorted排序分析_Github: 同样只提到了 python 中的 sorted 排序内部实现是 timsort,并没有说 sort (知乎回答的一个链接)。

  3. C++,java,Python的内部实现sort怎么实现的_优快云:内容提到 python内部的sort采用的是混合(hybrid)排序,规模小的时候采用 binary insertion,规模大的时候采用 sample sort 。

  4. list.sort 方法和 sorted 函数_《流畅的Python》: 注7 中提到 python的排序算法——Timesort——是稳定的,意思是就算两个元素比不出大小,在每次排序的结果里他们的相对位置是固定的。

以上大量回答都指向Timsort,那么就继续看看这是个啥

Timesort

维基百科:Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。Tim Peters在2002年设计了该算法并在Python中使用(TimSort 是 Python 中 list.sort 的默认实现)。该算法找到数据中已经排好序的块-分区,每一个分区叫一个run,然后按规则合并这些run。Pyhton自从2.3版以来一直采用Timsort算法排序,现在Java SE7和Android也采用Timsort算法对数组排序。

操作

1.1 run的最小长度

1.2 优化run的长度

1.3 合并run

1.4 合并步骤

1.5 Galloping模型

性能

Timesort核心过程:

TimSort 算法为了减少对升序部分的回溯和对降序部分的性能倒退,将输入按其升序和降序特点进行了分区。排序的输入的单位不是一个个单独的数字,而是一个个的块-分区。其中每一个分区叫一个run。针对这些 run 序列,每次拿一个 run 出来按规则进行合并。每次合并会将两个 run合并成一个 run。合并的结果保存到栈中。合并直到消耗掉所有的 run,这时将栈上剩余的 run合并到只剩一个 run 为止。这时这个仅剩的 run 便是排好序的结果。

综上述过程,Timsort算法的过程包括

(0)如果数组长度小于某个值,直接用二分插入排序算法

(1)找到各个run,并入栈

(2)按规则合并run

操作

现实中的大多数据通常是有部分已经排好序的,Timsort利用了这一特点。Timsort排序的输入单位不是一个个单独的数字,而是一个个的分区。其中每一个分区叫一个run(图1)。针对这个 run 序列,每次拿一个 run 出来进行归并。每次归并会将两个 run 合并成一个 run。每个run最少要有2个元素。Timesor按照升序和降序划分出各个run:run如果是升序的,那么run中的后一元素要大于或等于前一元素(a[lo] <= a[lo + 1] <= a[lo + 2] <= ...);如果run是严格降序的,即run中的前一元素大于后一元素(a[lo] > a[lo + 1] > a[lo + 2] > ...),需要将run 中的元素翻转(这里注意降序的部分必须是“严格”降序才能进行翻转。因为 TimSort 的一个重要目标是保持稳定性stability。如果在 >= 的情况下进行翻转这个算法就不再是stable)。

run的最小长度

run是已经排好序的一块分区。run可能会有不同的长度,Timesort根据run的长度来选择排序的策略。例如:

如果run的长度小于某一个值,则会选择插入排序算法来排序。run的最小长度(minrun)取决于数组的大小。当数组元素少于64个时,那么run的最小长度便是数组的长度,这时Timsort用插入排序算法来排序;

当数组元素大于等于63时,对于较大的阵列,从32到65范围选择的一个数字,称为Minrun,使得数组的大小除以最小run大小,等于或略小于2的幂。最终算法只取数组大小的六个最高有效位。如果设置了任何保留位,则加1,并将将结果作为minrun。该算法适用于所有情况,包括数组大小小于64的算法。
run

图1 run

优化run的长度

优化run的长度是指当run的长度小于minrun时,为了使这样的run的长度达到minrun的长度,会从数组中选择合适的元素插入run中。这样做使大部分的run的长度达到均衡,有助于后面run的合并操作。

合并run

划分run和优化run长度以后,然后就是对各个run进行合并。合并run的原则:

run合并的技术要保证有最高的效率。当Timsort算法找到一个run时,会将该run在数组中的起始位置和run的长度放入栈中,然后根据先前放入栈中的run决定是否该合并run。Timsort不会合并在栈中不连续的run(Timsort不会合并非连续run,因为这样做会导致所有三个run共有的元素相对于中间run变得混乱)

Timsort会合并在栈中2个连续的run。X、Y、Z代表栈最上方的3个run的长度(图2),当同时不满足下面2个条件是,X、Y这两个run会被合并,直到同时满足下面2个条件,则合并结束:

( 1 ) X > Y + Z ( 2 ) Y > Z (1) X>Y+Z \\ (2) Y>Z (1)X>Y+Z(2)Y>Z

例如:如果 X < Y + Z X<Y+Z X<Y+Z,那么 X + Y X+Y X+Y合并为一个新的run,然后入栈。重复上述步骤,直到同时满足上述2个条件。当合并结束后,Timsort会继续找下一run,然后找到以后入栈,重复上述步骤,及每次run入栈都会检查是否需要合并2个run。

合并run

图2 合并run

合并run

合并2个相邻的run需要临时存储空闲,临时存储空间的大小是2个run中较小的run的大小。Timsort算法先将较小的run复制到这个临时存储空间,然后用原先存储这2个run的空间来存储合并后的run(图3)。

临时存储空间

图3 临时存储空间

简单的合并算法是用简单插入算法,依次从左到右或从右到左比较,然后合并2个run。为了提高效率,Timsort用二分插入算法(binary merge sort)。先用二分查找算法/折半查找算法(binary search)找到插入的位置,然后再插入。

例如,我们要将A和B这2个run合并,且A是较小的run。因为A和B已经分别是排好序的,二分查找会找到B的第一个元素在A中何处插入(图4)。同样,A的最后一个元素找到在B的何处插入,找到以后,B在这个元素之后的元素就不需要比较了(图5)。这种查找可能在随机数中效率不会很高,但是在其他情况下有很高的效率。

run合并过程1

图4 run合并过程1

run合并过程2

图5 run合并过程2

Galloping模型

类似上述run的合并过程,参见维基百科Galloping Model

性能

根据信息学理论,在平均情况下,比较排序不会比 O ( n l o g n ) O(nlogn) O(nlogn)更快。由于Timsort算法利用了现实中大多数数据中会有一些排好序的区,所以Timsort会比
O ( n l o g n ) O(nlogn) O(nlogn)快些。对于随机数没有可以利用的排好序的区,Timsort时间复杂度会是 l o g ( n ! ) log(n!) log(n!)。

Timesort与其他比较排序算法的性能比较

Timesort时间复杂度
Timesort空间复杂度

说明

JSE 7对对象进行排序,没有采用快速排序,是因为快速排序是不稳定的,而Timsort是稳定的。

下面是JSE7 中Timsort实现代码中的一段话,可以很好的说明Timsort的优势:

A stable, adaptive, iterative mergesort that requires far fewer than n lg(n) comparisons when running on partially sorted arrays, while offering performance comparable to a traditional mergesort when run on random arrays. Like all proper mergesorts, this sort is stable and runs O(n log n) time (worst case). In the worst case, this sort requires temporary storage space for n/2 object references; in the best case, it requires only a small constant amount of space.

大体是说,Timsort是稳定的算法,当待排序的数组中已经有排序好的数,它的时间复杂度会小于 O ( n l o g n ) O(nlogn) O(nlogn)。与其他合并排序一样,Timesrot是稳定的排序算法,最坏时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)。在最坏情况下,Timsort算法需要的临时空间是n/2,在最好情况下,它只需要一个很小的临时存储空间

参考

  1. sort与sorted区别

  2. Python3中自定义排序原理

  3. Wiki/Timsort

  4. Wiki/Samplesort

  5. python 的内部排序算法list.sort

  6. 什么是Timesort排序方法

  7. Timsort原理介绍

  8. 流畅的python/page-36

  9. 关于Timsort算法的Bug(已经影响Android、Java、python不知道有没有被修复)

Heap Sort 的原理及Python实现 1.Heap表示方法 满足以下性质的二叉树Binary Tree可以成为Binary Heap: Complete Tree:所有的层都是完全的,除了最后一层,且最后一层的叶子靠左。 Min Heap or Max Heap:根节点是最大值或者最小值,而且这个性质对于任何递归得到的子树都成立。 Binary Heap通常使用array表示: 根节点在array[0]; array[(i-1)... 阅读详情

相关推荐

Python-Python排序容器类型SortedListSortedDict和SortedSet

Sorted Containers-Python可排序的容器类型:SortedList, SortedDict, and SortedSet使用纯python编写,但是速度跟用C实现一样快

python sort函数内部实现原理

目录 引言 sort 与 sorted 内部实现原理的回答 Timsort 1 操作 2 性能 1 操作 1.1 run的最小长度 1.2 优化run的长度 1.3 合并run 1.4 合并run步骤 1.5 Galloping 模型 2 性能 说明: 博客搬运地点 正文 回到顶部 引言 前不久在这篇文章sort与sorted的区别中收到了这样的一个提问:“python的 sort 内部实现机制是什么?时间复杂度是多...

qq_42533216的博客 4063

Nordic nRF52832实战:手把手教你搭建智能手环BLE通信框架(附完整代码)

本文详细介绍了如何使用Nordic nRF52832芯片搭建智能手环的BLE通信框架,涵盖芯片优势、协议栈初始化、低功耗广播策略及健康数据服务实现。通过完整代码示例和架构设计,帮助开发者快速掌握蓝牙低功耗通信技术,适用于可穿戴设备开发。

weixin_29192141的博客 246

python sort怎么用_Python的sort用法以及原理

在python中如果要对list, tuple, dict进行排序,一般会用到sort函数1. 基本用法1.1 列表123456x = [4, 6, 2, 3]y = x.sort()z = sorted(x)print(x)print(y)print(z)output:123[2,3,4,6]None[2,3,4,6]sort和sorted的原理类似,区别在于sort()是直接对原对象进行排序,...

weixin_39646018的博客 3469

GWAS与eQTL相结合,进一步筛选疾病相关基因

欢迎关注”生信修炼手册”!在GWAS分析结果中,大部分显著的SNP位点都位于非编码区,很难直接挖掘这些位点的调控机制。通常假设与疾病关联的SNP位点通过调控基因表达来发挥作用,而eQTL...

庐州月光的博客 1万+

EBOM转MBOM实战:华为云数字工厂如何5步搞定BOM自动转换(含避坑指南)

本文详细解析了华为云数字工厂平台如何通过五步自动化流程实现EBOM到MBOM的高效转换,涵盖模型预配置、逻辑流编排、工艺属性注入等关键步骤,并提供了多工厂差异化配置、历史数据迁移等典型场景的避坑指南。该方案显著提升转换效率,降低差错率,助力企业实现数字化转型。

weixin_29215391的博客 268

python排序方法sorted和list.sort()使用讲解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

yinyoudamo的博客 5259

【教程4>第6章>第26节】基于FPGA的MMSE信道估计与均衡系统实现与整体测试,并对比LS信道估计

通过前面几个章节的学习,我们完成了MMSE信道估计和均衡系统。为了进一步验证MMSE信道估计的性能,我们在系统的最后,增加一个信道估计误差计算程序。由于MMSE信道估计,其主要优势在SNR较小时提现,因此测试对比时,我们在testbench中,将SNR设置为2db。然后m值,我们不考虑一个固定值,而是一直累加,直到所设置的仿真时间结束。通过对比可以看到,MMSE信道估计性能优于LS信道估计。这样方便FPGA中的误差计算。

FPGA/MATLAB学习教程/源码/项目合作开发 1599

Python实现几大排序算法的原理和实现

目录 冒泡排序 选择排序 插入排序 快速排序 希尔排序 归并排序 堆排序     这里用Python实现了简单的7种排序,还有三种可以参考下面文章 https://www.cnblogs.com/onepixel/p/7674659.html  https://www.jianshu.com/p/7d037c332a9d https://blog.youkuaiyun.com/s...

Deft_MKJing的博客 1167

【天气雷达】双偏振产品-差分反射率ZDR详解

双偏振产品-差分反射率ZDR详解。

珞瑜的博客 5407

编写python脚本调用ordinals以及BRC20的接口

1、钱包地址生成walletreceive,对应ord命令:ord wallet receive。6、测试手动出块generate,这个只在regtest链节点用得上。所有接口都是post请求,采用postman进行测试。4、测试bitcoin转币sendtoaddress。7、测试其他的wallet方法wallet。2、钱包币种铭刻inscription,对应bitcoin-cli命令。对应bitcoin-cli命令。对应bitcoin-cli命令。fee.json文本模板。还可以加很多根据需要加减。

云深海阔专栏 1047

python sort函数原理_python sort函数原理

python sort()用法一个字典 adic = {1:98,2:12,3:78} 对这个排序: alist= [] for i in adPython中的sort()方法用于数组排序,下面以实例形式对此加以详细说明: 一、基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的。 x = [4, 6, 2, 1, 7, 9]...

weixin_30497687的博客 3720

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

Robot_PLC_HMI_Automation 8584

对于Python里sort函数原理的好奇

今天上课时老师讲到了排序,这就强烈引起了我对sort函数原理的好奇心,自己去网上搜了搜,发现只能理解,只知道是Timesort算法,但根本想不出这种算法要怎么写! 不多说,直接上链接吧,留给以后自己学习用。 Timesort文档:https://blog.youkuaiyun.com/yangzhongblog/article/details/8184707 代码和原理:https://blog.csdn.n...

Oliver______的博客 988

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

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

python中的sort排序原理

参考文档:https://www.zhihu.com/question/36280272                   https://blog.youkuaiyun.com/yangzhongblog/article/details/8184707 python中的sorted排序:Timsort算法。 Timesort wiki:http://en.wikipedia.org/wiki/Tim...

山中有石为玉 8165

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python sort函数原理_python sorted函数原理解析及练习

这篇文章主要介绍了python sorted函数原理解析及练习,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下前两天学习了一下socket编程,在向某大神请教问题时被嫌弃了,有一种还没学会走就想跑的感觉。大神说我现在的水平应该去做一些像是操作文件、序列号等的小练习来加深理解。下面是他给我出的小练习:1、datas = [['sherry',19,'...

weixin_39614750的博客 106

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python sort函数原理_对python3 sort sorted 函数的应用详解

python3 sorted取消了对cmp的支持。python3 帮助文档:sorted(iterable,key=None,reverse=False)key接受一个函数,这个函数只接受一个元素,默认为Nonereverse是一个布尔值。如果设置为True,列表元素将被倒序排列,默认为False着重介绍key的作用原理:key指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的...

weixin_39557576的博客 330

Python排序函数详解:sort()、sorted()与reversed()的核心原理与实战应用

在数据处理与算法实现中,排序是基础且关键的操作,它直接影响程序的效率和可读性。Python内置的排序函数基于Timsort算法,提供了稳定且高效的排序能力。理解其原理有助于编写更优化的代码,尤其在处理大规模数据或复杂对象时。通过key参数,可以实现多级排序和自定义排序逻辑,这在数据分析、后端开发和算法预处理等场景中极为实用。例如,使用sorted()进行非原地排序可保留原始数据,而list.sort()则适合原地修改以提高内存效率。reversed()作为反向迭代器,在处理大文件或只需一次遍历时,能显著降低

weixin_34331102的博客 362

python sorted原理_Python sort()和sorted()

Python sort()和sorted()sort 与 sorted 区别:sort()sort()是列表list的方法之一L.sort(key=None, reverse=False)sorted()sorted() 函数可以对任意可迭代对象排序。返回一个列表sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在...

weixin_36247139的博客 182

python sort函数原理_Python高阶函数、内建高阶函数及sorted函数原理

高阶函数函数在Python中是一等公民函数也是对象,可调用的对象函数可以作为普通变量,参数,返回值等成为高阶函数的必要条件:接收一个或多个函数作为参数输出一个函数示例:defcounter(base):def inc(step=1):nonlocal basebase+= step #base = base + step ,使用局部变量,但是此没有base局部变量,需要使用nonlocal bas...

weixin_39621495的博客 226

python .sort()原理_JS基础篇--sort()方法的用法,参数以及排序原理

sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode码点。语法:arrayObject.sort(sortby);参数sortby可选。规定排序顺序。必须是函数。注:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。如果想按...

weixin_39924779的博客 231

python sort函数key_理解sort()函数中的key

最近在看effective-python,第二章函数中提到了优先排序的概念,具体代码如下:values = [1, 5, 3, 9, 7, 4, 2, 8, 6]group = [7, 9]def sort_priority(values, group):def helper(x):if x in group:return (0, x)return (1, x)values.sort(key=he...

weixin_39555579的博客 2815

python中的sorted()和list.sort()原理和比较

Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。Tim Peters在2002年设计了该算法并在Python中使用(TimSort 是 Python 中 list.sort 的默认实现)。该算法找到数据中已经排好序的块-分区,每一个分区叫一个run,然后按规则合并这些run。 具体参考: https://www.cnblogs.com/clement-jiao/p/9243066.html ...

weixin_43100127的博客 210
上一篇: 你管这叫操作系统源码(完结)
下一篇: 认真聊聊中断(软中断)
wq_0708
博客等级 码龄6年 2万+粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值