Python实现快速排序算法及去重的快速排序的简单示例


Posted in Python onJune 26, 2016

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

现在通过一个实例来说明快排。

比如有一个数组:

6 2 4 5 3

第一步:选取一个基准数,不要被这个名词吓到了,你可以把它看作是一个比较大小的数,因为排序就是比较大小,

比如我选取最后一个数3为基准数,依次把数组的数和3比较,比3小的放左边,比3大的放右边,这样有如下结果:

2 3 6 4 5

第二步:判断区间个数,经过第一步后左边区间只有一个数了,没有数字再和它比较了,因此不需要重复操作,右边区间还有:

6 4 5

重复第一步,选取5作为基准数,得到比较结果:

4 5 6

这样左右两边区间都只有一个数了,这就标志着排序完成,最后把所有区间合并就得到排序结果:

2 3 4 5 6
def quick_sort(array):
  less = []; greater = []
  if len(array) <= 1:
    return array
  pivot = array.pop()
  for x in array:
    if x <= pivot: less.append(x)
    else: greater.append(x)
  return quick_sort(less) + [pivot] + quick_sort(greater)
list = [2,4,2,6,7,8,1]
print quick_sort(list)
[1, 2, 2, 4, 6, 7, 8]

相比C、C#、JAVA之类的是不是简单多了^.^

TIP:去重的快速排序
如下, 只需要把集合修改为单值元素,这里我们使用Python3来演示:

# -*- coding: utf-8 -*- 
  
import random 
 
L = [2, 3, 8, 4, 9, 5, 6, 5, 6, 10, 17, 11, 2] 
 
def qsort(L): 
  if len(L)<2: return L 
  pivot_element = random.choice(L) 
  small = [i for i in L if i< pivot_element] 
  #medium = [i for i in L if i==pivot_element] 
  large = [i for i in L if i> pivot_element] 
  return qsort(small) + [pivot_element] + qsort(large) 
 
print(qsort(L))

输出:

[2, 3, 4, 5, 6, 8, 9, 10, 11, 17]

也可以直接使用, 集合(set)进行排序和去重.

mylist = list(set(L)) #集合自动排序字符串
Python 相关文章推荐
介绍Python的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python中常用的高阶函数实例详解
Feb 21 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
Flask缓存静态文件的具体方法
Aug 02 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 #Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 #Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 #Python
Python的装饰器用法学习笔记
Jun 24 #Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 #Python
深入解析Python编程中super关键字的用法
Jun 24 #Python
深入了解Python数据类型之列表
Jun 24 #Python
You might like
PHP 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
php笔记之:AOP的应用
2013/04/24 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
微信JS接口大全
2016/08/25 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
Django学习之文件上传与下载
2019/10/06 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
实习单位推荐信范文
2013/11/27 职场文书
推广活动策划方案
2014/08/23 职场文书
作风建设剖析材料
2014/10/06 职场文书
停课通知书
2015/04/24 职场文书
爱的教育读书笔记
2015/06/26 职场文书
谢师宴学生致辞
2015/07/27 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电