写点什么

NumPy 三种排序的表现与思考

  • 2024-05-25
    湖南
  • 本文字数:1026 字

    阅读完需:约 3 分钟

Numpy 库给我们提供了三种数组排序的算法:

  1. 快速排序(Quicksort): 所谓快速排序就是一种就地排序算法。就地是啥意思?就是它不会创建原数组的一个副本,而是和原数组共用数据,直接修改原数组的结构--对标三国演义有些类似司马懿夺取魏国,殿宇啥的都不换,我就换你曹魏的内部,哈哈。

  2. 归并排序(mergesort): 归并排序使用的打法是合并操作对数组进行排序,通常将数组分为两半,分别进行排序,然后将分别排序好的两半再进行合并。这个“典故”相似于赤壁之战的孙刘联军。哎,我们先在一起商议,然后分头行动,最后在汇合共同击退敌人。

  3. 堆排序(heapsort): 堆排序是怎么个情况呢?它是使用堆数据结构来管理无序的数据集,近似于一个二叉树,有最大堆和最小堆。大堆的节点关键字大于或等于小堆的节点关键字。这就好比于三国中的前期,袁绍率领的 18 路诸侯,他做盟主,下面有 18 路大军,18 路大军下有许许多多的小股势力一样。


以上就形象的介绍下三大排序算法的区别,如有不妥敬请谅解吧!


下面我们就实战一下三种排序在代码中的表现如何。

表现

为了公平起见,我们使用 NumPy 库给我们提供的 sort()函数进行测试,先来看下 sort()函数的格式和所需参数。


格式:numpy.sort(a, axis, kind, order)


参数:a:需要排序的数组;axis:数组的轴;kind: 排序算法;order:排序的字段


我们主要是测试 kind 参数,其他参数暂时不使用。

第一项:速度

经过测试,在速度方面,快速排序(39 毫秒) 、 归并排序(54 毫秒) 、 堆排序(76 秒)。

第二项:稳定性

稳定性方面是这么进行定义的,我们可以使用 numpy 库给我们提供的 argsort 函数来进行排序算法的稳定性,argsort 函数函数返回的是元素排序后的索引值,如果原数组之前的排序的索引不变,那么说明排序算法是稳定的。我们根据稳定性的定义一个个的进行测试一下。

经过测试以后,这三种排序怎么都是不稳定的呢?然后去翻了翻文档,但是文档中提供的是:

quicksort:不稳定;mergesort:稳定;heapsort:不稳定。


这边也有函数调用的说明,截图给大家看一下。

这个地方我也是没有想明白😓😵,但是还是得写出来,我相信掘友的力量是无穷的会帮我解决。

思考

NumPy 排序法自我认为,并不是哪个排序算法速度快,或者稳定性高,就在项目中频繁的进行使用,这个跟我们开发的项目大小和环境也有一定的关系吧,选择合理的排序算法,也是能提高项目性能的。


还有就是在以后的新知识学习的时候,我感觉一定要动手去做,才会发现意想不到的结果吧。


作者:二闹

链接:https://juejin.cn/post/7372371878058999827

用户头像

欢迎关注,一起学习,一起交流,一起进步 2020-06-14 加入

公众号:做梦都在改BUG

评论

发布
暂无评论
NumPy三种排序的表现与思考_Python_我再BUG界嘎嘎乱杀_InfoQ写作社区