人来人往,蜚短流长,不求此生匆匆过,但求每日在成长

快速排序严重依赖分区,分区部分完成就代表排序成功了一半

1、详细思路见代码注释部分:

def quick_sort(l,low,high):

'''

分区的过程:

low代表左指针,high代表右指针

1、low会逐个向右移动,遇到大于或等于基准元素时,停止

2、high会逐个向左移动,遇到小于或等于基准元素时,停止

3、然后将两指针所指的元素进行交换

4、重复上述步骤,直到两指针重合,或者左指针在右指针的右边

5、最后将轴与左指针的值交换位置

分区的目的:

使基准元素到正确的位置,然后再把基准元素左右两部分分别进行排序

'''

if low >= high: # 当分出的子列表长度为0或1时,就不会再递归下去了

return

pivot = l[high] # 设置初始的基准元素

inital_low = low # 将初始的low和high存储一下

inital_high = high

while low < high: # 步骤4

while l[low]

low+=1

while l[high] > pivot: # 步骤2

high -= 1

l[low], l[high] = l[high], l[low] #步骤3

l[low],pivot = pivot,l[low] # 步骤5

'''

分区后,将基准元素左右两部分分别进行排序

当分出的子列表长度为0或1时,就不会再递归下去了

'''

quick_sort(l, inital_low, low-1) #基准左边部分

quick_sort(l, low+1, inital_high) #基准右边部分

return l

if __name__=='__main__':

l = [0,5,2,1,6,3]

print(quick_sort(l, 0, len(l)-1))

2、效率分析

①分区步骤中,主要包含

比较:因为每个值都要和基准元素进行比较,所以比较次数为N;

交换:交换的次数则取决于数据的排列情况。一次分区里,交换最少会有1次,最多会有N / 2次,因为即使所有元素都需要交换,我们也只是将左半部分与右半部分进行交换,所以平均下来,粗略估算要进行N/4次交换

因此,分区步骤次数为N+N/4,大O计数法为O(N)

②因为等分发生了log N次,而每次都要对总共N个元素做分区,所以总步数为N×log N。

因此快速排序算法最佳时间复杂度和平均时间复杂度均为

最佳情况是在基准元素每次都在子列表的中间

最坏情况是O(N^2)

由于快速排序在平均情况下表现优异,于是很多编程语言自带的排序函数都采用它来实现。

参考书目:

《数据结构与算法图解》作者:[美]杰伊·温格罗

python快速排序算法详细图解_详解python实现快速排序算法相关推荐

  1. python从random生成列表_详解Python利用random生成一个列表内的随机数

    详解Python利用random生成一个列表内的随机数 首先,需要导入random模块: import random 随机取1-33之间的1个随机数,可能重复: random.choice(range ...

  2. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  3. 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成

    详解Python基础random模块随机数的生成 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python基础random模块随机数的生成.txt ] ( ...

  4. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  5. python函数的使用场景_详解python中strip函数的使用场景

    python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.l ...

  6. python super()方法的作用_详解python的super()的作用和原理

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递.uz0免费资源网 今天我们介绍的主角是s ...

  7. python中break怎么用_详解Python中break语句的用法

    详解Python中break语句的用法 在Python中的break语句终止当前循环,继续执行下一个语句,就像C语言中的break一样. break最常见的用途是当一些外部条件被触发,需要从一个循环中 ...

  8. python 遍历list删除元素_详解Python遍历列表时删除元素的正确做法

    这篇文章主要介绍了详解Python遍历列表时删除元素的正确做法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.问题描述 这是 ...

  9. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

最新文章

  1. 用IP地址的用途理解Loopback接口
  2. 转 ios 里如何判断当前应用的定位服务是否可用
  3. 卷积神经网络原理及实现
  4. 沉默已久的华为突然宣告杀入无人驾驶领域,司机将全部失业!
  5. Algorithm(1) - Karatsuba multiplication
  6. 容器编排技术 -- kubernetes设计理念
  7. java数据结构之快速排序
  8. 分布式文件系统FastDFS看这一篇就够了(文件上传下载、单机部署及集群部署)
  9. Lync常识之Lync Server有哪些角色
  10. 刷入第三方Recovery系统TWRP
  11. flv.js插件播放flv格式的视频实例(vue)
  12. 计算机辅助电话访问优势,电话访问的优点缺点、优势不足、局限性
  13. 互联网监控直播-LiveGBS分发出RTMP、HLS、FLV、RTSP视频流说明介绍
  14. 微信小程序:微擎开发飞鹅打印机配置
  15. 通话录音自动上传功能
  16. 通用视觉技术体系“书生”(INTERN)由七大模块组成
  17. pc端微信小程序抓包
  18. 杭电计算机组成原理实验九R-I,杭电计组实验9-实现R-I型指令的CPU设计实验.doc
  19. qchart 图表_实战PyQt5: 158-QChart图表之线条缩放显示
  20. Django-16:rest-framework与jwt

热门文章

  1. 世界读书日Wed代码
  2. 计算机演示文稿的使用步骤,将编辑好的演示文稿在其他计算机放映用什么功能...
  3. 9158意欲赴美上市 恐遭山寨公司冲击
  4. 深入理解APP的缓存原理机制
  5. 有哪些好用的远程办公软件
  6. 百万富翁c语言题目,谁是百万富翁题目答案是什么 谁是百万富翁全部答案汇总...
  7. 我花50元赚来190元的贴吧推广经验
  8. 变量模板smarty模板 入门学习
  9. HTTPS列表在浏览器输入可以正常显示,但在登陆器上不显示是怎么回事?
  10. 大数据Spark(三十一):Spark On Hive