什么是快速排序

同冒泡排序(上篇博文)一样,快速排序也属于交换排序,通过元素之间的比较交换位置来达到排序的目的。

不同的是,冒泡排序在每一轮中只是把1个元素冒泡到数组的一端,而快速排序是:每一轮挑选一个基准元素,让比基准元素大的元素移动到数组的一边,比基准元素小的移动到数组的另外一端,从而把数组拆解成两部分。

举例说明一下,假设有如下的数组:

5 8 6 3 9
第一轮:

1.设定基准元素: 假设以第一个元素5为基准元素

5 8 6 3 9

2.比较: 蓝色元素为比基准元素5大的元素,绿色的为比基准元素小的元素。

5 8 6 3 9

3.交换位置: 默认升序,比基准元素大的放左边,比基准元素小的放右边

3 5 8 6 9

第一轮分析:

第一轮以基准元素5为界,将数组分为比5小的子集(A),和比5大的子集(B),所以接下来继续按照这样的步骤将A、B两部分子集排好就好了!!
子集A:

3

基准元素:

5

子集B:

8 6 9
第二轮:

由于子集A只有一个元素,不用再排序了,子集B有三个元素,接着用上面的步骤排序:

1.设定基准元素: 假设以第一个元素8为基准元素

8 6 9

2.比较: 蓝色元素为比基准元素8大的元素,绿色的为比基准元素小的元素。

8 6 9

3.交换位置: 默认升序,比基准元素大的放左边,比基准元素小的放右边

6 8 9

第二轮分析:

由于子集A只用一个元素,不用再做排序,故第二轮主要是对子集B做排序,排序结果如上图,子集B排序后,左右元素各一个,也不用再做排序,故到此为止!!!

算法复杂度

通过上面的举例可以看出,快速排序采用的是分治法的思想,这种思想的好处是什么呢?

假如我们有8个元素的数组,如果用冒泡排序的话,需要比较7轮,每一轮的把一个元素移动到数组的一端,这样的时间复杂度是O(n^2)。

而快排采用分治的思想,初始数组在每一轮都被拆成两部分,每一部分在下一轮又分别被拆成两部分,直到不可拆为止,拆分方式就如二叉树一般。

每一轮的比较和交换,需要把数组的全部元素都遍历一遍,时间复杂度是O(n),而大约需要logn轮(默认以2为底),因此快速排序算法的平均时间复杂度是O(nlogn)

代码实现(递归)

class Solution:def quick_sort(self,data):    if len(data) >= 2:           # 如果数组长度大于等于2,则进行比较     pivot = data[0]          # 选取第一个元素为基准,当然随机选取最好left, right = [], []     # 定义基准值左右两侧的列表        data.remove(pivot)       # 从初始数组中移除基准值        for i in data:           # 遍历       if i >= pivot:       # 大于基准值的元素,放进right数组中          right.append(i)            else:                left.append(i)   # 小于基准值的元素,放进left数组中     return quick_sort(left) + [pivot] + quick_sort(right)      # 递归   else:        return data
if __name__== "__main__":#验证
solution = Solution()
test = [5,8,6,3,9,2,1,7]
solution.quick_sort(test )输出:
[1, 2, 3, 5, 6, 7, 8, 9]

代码实现(非递归)

按照算法导论中的思想:

# 算法导论里的思想,i表示[l,i]都比pivot小的元素下标, j 依次遍历元素
def quick_sort_other(array, left, right):   if left >= right:    return arraystack = [left,right]     while stack:low = stack.pop(0)high = stack.pop(0)if high <= low:continuepivot = array[high]i = low - 1 for j in range(low,high+1):if array[j] <= pivot:i += 1array[i],array[j] = array[j],array[i]stack.extend([low, i-1, i + 1, high])return array

验证

输入:
array = [6,1,4,2,3,9,5]
quick_sort_other(array,0,len(array)-1)
输出:
[1, 2, 3, 4, 5, 6, 9]

快排-Python实现相关推荐

  1. python与seo实战课程下载_黑帽seo教程:SEO快排套路与SEO快排Python应用编程技术(零基础)...

    黑帽seo教程:SEO快排套路与SEO快排Python应用编程技术(零基础) 授课内容简介 两个模块:「SEO套路」和「SEO应用编程」 「SEO套路」模块,分 "域名.内容&模板. ...

  2. 归并排序、快速排序、二路快排、三路快排python实现

    源代码: https://github.com/lzneu/Algrithm_python O(n*logn)级别的排序: |-归并排序     分成log(n)个层级 每个层级进行O(n)排序   ...

  3. python实现快排算法(quicksort)

    python实现快排算法(quicksort) 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后 ...

  4. Python 实现快排、堆排

    Python 实现快排.堆排 1.快排 原理:(升序) 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空: 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为 ...

  5. python写快排_python 实现快速排序

    Python排序算法之快速排序 快速排序(quickSort) 快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这 ...

  6. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  7. python编码效率高吗_【原创】杠精的日常-讨论python快排的效率

    事情的起因是我的一个回答: 里面的大佬提供了一个快排算法 def 快排(a): return a and 快排([i for i in a if ia[0]]) 一行代码写的十分优雅. 于是我写了如下 ...

  8. [leetcode]求数组的第k个最大值,python快排解法

    python版快排 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:self.quicksort( ...

  9. python模拟seo快排vps点击代码实操

    本期主要是介绍一下利用vps拨号的方法去运行用户点击行为,俗称seo模拟快排,那么顾名思义,快排的运行方式需要在一台拨号服务器上进行,本次模拟快排的代码是采用python中的pyppeteer库,这个 ...

  10. python seo编程_gogo闯SEO快排教程及应用编程(同步官方)

    gogo闯SEO快排教程及应用编程(同步官方) https://www.zygx8.com/thread-11604-1-1.html 授课内容简介: 两个模块:「SEO套路」和「SEO应用编程」 「 ...

最新文章

  1. PHP微信公众号开发插件,基于ThinkCMF1.5.0开发的微信公众号插件
  2. .NET可变性解析(协变和逆变)
  3. gis怎么通过水库划分子流域_到底是谁在革GIS的命?
  4. ubuntu 下安装 activate-power-mode
  5. 2017年秋季个人阅读计划
  6. 把存储过程结果集SELECT INTO到临时表
  7. linux下iptables讲解
  8. socket和http协议
  9. ext4fs error mysql_请教一个 Linux 挂在磁盘阵列报错 EXT4-fs error 问题
  10. 双十一丝般顺滑体验背后:阿里云洛神网络虚拟化系统揭秘
  11. internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...
  12. android listview 数据数组制作,android – 从对象的数组列表中填充listview
  13. Sublime Text中文乱码
  14. Spring 自带的一些工具类
  15. DNS 基础知识及 Linux DNS 服务器操作知识
  16. python 多关键字排序_用Python排序字​​典
  17. Fastjson 远程命令执⾏漏洞
  18. MYSQL 经纬度 地理位置
  19. 在虚拟机中安装windows server 2008
  20. python是什么意思中文、好学吗-零基础学python难吗?好学吗?

热门文章

  1. 苹果开发者被盯上了!Xcode又双叒叕被攻击了
  2. 独家:为了永不停机的计算服务 - 四月月刊 | 凌云时刻
  3. 一文看懂:边缘计算究竟是什么?为何潜力无限?(下)
  4. 跨5合并dnf无限连接服务器,不妨一试!跨5等跨区卡登陆卡黑屏解决办法分享
  5. python分类识别_Python构建图像分类识别器的方法
  6. 【基音频率】基音matlab基音频率计算【含Matlab源码 1384期】
  7. 【优化算法】头脑风暴优化算法(BSO)【含Matlab源码 497期】
  8. element ui后台html_Github上10 个优秀的后台控制面板
  9. 人工智能 企业变革_我们如何利用(人工)情报变革医院的运营管理
  10. 词嵌入生成词向量_使用词嵌入创建诗生成器