Numpy库给我们提供了三种数组排序的算法:
- 快速排序(Quicksort): 所谓快速排序就是一种就地排序算法。就地是啥意思?就是它不会创建原数组的一个副本,而是和原数组共用数据,直接修改原数组的结构--对标三国演义有些类似司马懿夺取魏国,殿宇啥的都不换,我就换你曹魏的内部,哈哈。
- 归并排序(mergesort): 归并排序使用的打法是合并操作对数组进行排序,通常将数组分为两半,分别进行排序,然后将分别排序好的两半再进行合并。这个“典故”相似于赤壁之战的孙刘联军。哎,我们先在一起商议,然后分头行动,最后在汇合共同击退敌人。
- 堆排序(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排序法自我认为,并不是哪个排序算法速度快,或者稳定性高,就在项目中频繁的进行使用,这个跟我们开发的项目大小和环境也有一定的关系吧,选择合理的排序算法,也是能提高项目性能的。
还有就是在以后的新知识学习的时候,我感觉一定要动手去做,才会发现意想不到的结果吧。