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中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
Django对models里的objects的使用详解
Aug 17 Python
python3多线程知识点总结
Sep 26 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
python3实现弹弹球小游戏
Nov 25 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
介绍一下Ruby的特点
2013/01/20 面试题
秋季运动会表扬稿
2014/01/16 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
商业街策划方案
2014/05/31 职场文书
设备收款委托书范本
2014/10/02 职场文书
简爱读书笔记
2015/06/26 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
pytorch通过训练结果的复现设置随机种子
2021/06/01 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
Python制作动态字符画的源码
2021/08/04 Python
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL