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 初始化多维数组代码
Sep 06 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
跟老齐学Python之赋值,简单也不简单
Sep 24 Python
python图像常规操作
Nov 11 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
详解python中的hashlib模块的使用
Apr 22 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
jupyter 导入csv文件方式
Apr 21 Python
python利用tkinter实现图片格式转换的示例
Sep 28 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
js中this用法实例详解
2015/05/05 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
Django之模型层多表操作的实现
2019/01/08 Python
关于Python作用域自学总结
2019/06/10 Python
pytorch梯度剪裁方式
2020/02/04 Python
python文件和文件夹复制函数
2020/02/07 Python
python如何停止递归
2020/09/09 Python
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
颁奖典礼主持词
2014/03/25 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
研究生简历自我评
2015/03/11 职场文书
保送生自荐信范文
2015/03/26 职场文书
大学运动会加油稿
2015/07/22 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
详解python的内存分配机制
2021/05/10 Python