Python一行代码实现快速排序的方法


Posted in Python onApril 30, 2019

今天将单独为大家介绍一下快速排序!

一、算法介绍

排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的。

Python一行代码实现快速排序的方法

二、算法原理

快排的实现方式多种多样,猪哥给大家写一种容易理解的:分治+迭代,只需要三步:

在数列之中,选择一个元素作为"基准"(pivot),或者叫比较值。数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举个例子,假设我现在有一个数列需要使用快排来排序:{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48},我们来看看使用快排的详细步骤:

选取中间的26作为基准值(基准值可以随便选)数列从第一个元素3开始和基准值26进行比较,小于基准值,那么将它放入左边的分区中,第二个元素44比基准值26大,把它放入右边的分区中,依次类推就得到下图中的第二列。然后依次对左右两个分区进行再分区,得到下图中的第三列,依次往下,直到最后只有一个元素分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区

Python一行代码实现快速排序的方法

三、代码实现

是不是很简洁很秀,如果再有面试官让你手写一个快排,你就把这行写上去吧,面试官见了都要喊你秀儿,哈哈。

在你感叹python吊炸天的同时,你因该考虑到代码的可读性问题,lambda函数设计是为了代码的简洁性,但是滥用的话会导致可读性变得极差,而且现在pep8代码规范中也不建议使用lambda函数了,建议使用关键字def去定义一个函数,所以下面猪哥给大家写一段符合pythonic风格的快排代码

四、算法分析稳定性:

快排是一种不稳定排序,比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序比较性:因为排序时元素之间需要比较,所以是比较排序时间复杂度:快排的时间复杂度为O(nlogn)空间复杂度:排序时需要另外申请空间,并且随着数列规模增大而增大,其复杂度为:O(nlogn)归并排序与快排 :归并排序与快排两种排序思想都是分而治之,但是它们分解和合并的策略不一样:归并是从中间直接将数列分成两个,而快排是比较后将小的放左边大的放右边,所以在合并的时候归并排序还是需要将两个数列重新再次排序,而快排则是直接合并不再需要排序,所以快排比归并排序更高效一些,可以从示意图中比较二者之间的区别。

Python一行代码实现快速排序的方法

五、快排优化

快速排序有一个缺点就是对于小规模的数据集性能不是很好。可能有人认为可以忽略这个缺点不计,因为大多数排序都只要考虑大规模的适应性就行了。但是快速排序算法使用了分治技术,最终来说大的数据集都要分为小的数据集来进行处理,所以快排分解到最后几层性能不是很好,所以我们就可以使用扬长避短的策略去优化快排:

先使用快排对数据集进行排序,此时的数据集已经达到了基本有序的状态然后当分区的规模达到一定小时,便停止快速排序算法,而是改用插入排序,因为我们之前讲过插入排序在对基本有序的数据集排序有着接近线性的复杂度,性能比较好。

这一改进被证明比持续使用快速排序算法要有效的多。

六、模拟面试面试官:

你了解快排吗?你:略知一二面试官:那你讲讲快排的算法思想吧你:快排基本思想是:从数据集中选取一个基准,然后让数据集的每个元素和基准值比较,小于基准值的元素放入左边分区大于基准值的元素放入右边分区,最后以左右两边分区为新的数据集进行递归分区,直到只剩一个元素。面试官:快排有什么优点,有什么缺点?你:分治思想的排序在处理大数据集量时效果比较好,小数据集性能差些。面试官:那该如何优化?你:对大规模数据集进行快排,当分区的规模达到一定小时改用插入排序,插入排序在小数据规模时排序性能较好。面试官:那你能手写一个快排吗?你:

七、总结

以上所述是小编给大家介绍的Python一行代码实现快速排序的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python判断图片宽度和高度后删除图片的方法
May 22 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
centos6.4下python3.6.1安装教程
Jul 21 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
多个应用共存的Django配置方法
May 30 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
如何理解python面向对象编程
Jun 01 Python
python中turtle库的简单使用教程
Nov 11 Python
python基于win32api实现键盘输入
Dec 09 Python
python批量识别图片指定区域文字内容
Apr 30 #Python
Python3.5装饰器典型案例分析
Apr 30 #Python
python如何制作缩略图
Apr 30 #Python
Python3.5装饰器原理及应用实例详解
Apr 30 #Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
Apr 30 #Python
python制作图片缩略图
Apr 30 #Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 #Python
You might like
PHP学习之整理字符串
2011/04/17 PHP
PHP实现的简单日历类
2014/11/29 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
原生JS实现小小的音乐播放器
2017/10/16 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
python获取文件扩展名的方法
2015/07/06 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
什么是数组名
2012/05/10 面试题
娱乐节目策划方案
2014/06/10 职场文书
期末复习计划
2015/01/19 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS