Python算法:快速排序
最近准备去找工作,时隔几年又要把在学校时代压床底的算法掏出来吹吹灰尘了,真有种朝花夕拾的感觉…哈哈哈哈
毕竟如果面试要是写不出来,那真是太尴尬了。
写那么一波快速排序找找感觉2333
也许有人会问,我为啥把所有算法直接写在一起。
我就不!因为这样写好查啊…而且不想把自己的博文写得那么冗长。
开面见山,直奔主题。
运行环境 Runtime environment
1 | 操作系统: Windos10 |
背景
快速排序是一种常用得排序算法,比选择排序快得多。
例如:C语言标准库得函数qsort的实现就是快速排序。
快速排序也使用了D&C。
其实我也有点郁闷,我都用了Python还折腾这个干嘛..
Python的sorted排序,用的是狂霸酷拽Dior的TimeSort算法。至于TimeSort算法有多牛逼,自己去百度吧。
Python有这个原生工具函数在,还要啥自行车啊。23333
但是,没办法嘛,面试官要问的咯。
步步实现 快速排序
对排序算法来说,最简单的数组是啥样的?那就是根本不需要排序的数组。
比如:空数组或只有一个元素的数组,这种还排个屁。
于是我先排除这种情况。
1 | def quick_sort(tempArray): |
包含两个元素的数组,也不用多说了,比较一下大小互换一下位置就成,不赘述了。
如果包含多个元素,那就要加上递归操作来搞一下
1 | def quick_sort(tempArray): |
运行结果如下:
1 | [2, 4, 5, 6, 7, 7, 8, 9, 9, 38, 45] |
上面的快速排序中使用的是列表头一个元素作为基准值,这是为了方便理解。
但是你会发现如果你要处理有序的数组,每一次都是用数组第一个元素来作为基准值,那么导致其中的一个子集始终是空集。
这样就白瞎了那么多次递归,调用栈的高度也是相当大的。
在这里,若总是将数值的中间值作为基准值,那么数组始终都能对半分,就可以减少递归的调用次数。
魔改一下上面的代码
1 | from random import * |
运行结果如下:
1 | [2, 4, 5, 6, 7, 7, 8, 9, 9, 38, 45] |
总结
快速排序先要理解基准值是干什么用的。
实现快速排序时,随机选择元素作为基准值会更好些。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 快乐咸鱼のRaXianch窝!
评论
WalineValine