快排-Python实现
什么是快速排序
同冒泡排序(上篇博文)一样,快速排序也属于交换排序,通过元素之间的比较与交换位置来达到排序的目的。
不同的是,冒泡排序在每一轮中只是把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实现相关推荐
- python与seo实战课程下载_黑帽seo教程:SEO快排套路与SEO快排Python应用编程技术(零基础)...
黑帽seo教程:SEO快排套路与SEO快排Python应用编程技术(零基础) 授课内容简介 两个模块:「SEO套路」和「SEO应用编程」 「SEO套路」模块,分 "域名.内容&模板. ...
- 归并排序、快速排序、二路快排、三路快排python实现
源代码: https://github.com/lzneu/Algrithm_python O(n*logn)级别的排序: |-归并排序 分成log(n)个层级 每个层级进行O(n)排序 ...
- python实现快排算法(quicksort)
python实现快排算法(quicksort) 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后 ...
- Python 实现快排、堆排
Python 实现快排.堆排 1.快排 原理:(升序) 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空: 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为 ...
- python写快排_python 实现快速排序
Python排序算法之快速排序 快速排序(quickSort) 快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这 ...
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...
- python编码效率高吗_【原创】杠精的日常-讨论python快排的效率
事情的起因是我的一个回答: 里面的大佬提供了一个快排算法 def 快排(a): return a and 快排([i for i in a if ia[0]]) 一行代码写的十分优雅. 于是我写了如下 ...
- [leetcode]求数组的第k个最大值,python快排解法
python版快排 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:self.quicksort( ...
- python模拟seo快排vps点击代码实操
本期主要是介绍一下利用vps拨号的方法去运行用户点击行为,俗称seo模拟快排,那么顾名思义,快排的运行方式需要在一台拨号服务器上进行,本次模拟快排的代码是采用python中的pyppeteer库,这个 ...
- python seo编程_gogo闯SEO快排教程及应用编程(同步官方)
gogo闯SEO快排教程及应用编程(同步官方) https://www.zygx8.com/thread-11604-1-1.html 授课内容简介: 两个模块:「SEO套路」和「SEO应用编程」 「 ...
最新文章
- PHP微信公众号开发插件,基于ThinkCMF1.5.0开发的微信公众号插件
- .NET可变性解析(协变和逆变)
- gis怎么通过水库划分子流域_到底是谁在革GIS的命?
- ubuntu 下安装 activate-power-mode
- 2017年秋季个人阅读计划
- 把存储过程结果集SELECT INTO到临时表
- linux下iptables讲解
- socket和http协议
- ext4fs error mysql_请教一个 Linux 挂在磁盘阵列报错 EXT4-fs error 问题
- 双十一丝般顺滑体验背后:阿里云洛神网络虚拟化系统揭秘
- internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...
- android listview 数据数组制作,android – 从对象的数组列表中填充listview
- Sublime Text中文乱码
- Spring 自带的一些工具类
- DNS 基础知识及 Linux DNS 服务器操作知识
- python 多关键字排序_用Python排序字​​典
- Fastjson 远程命令执⾏漏洞
- MYSQL 经纬度 地理位置
- 在虚拟机中安装windows server 2008
- python是什么意思中文、好学吗-零基础学python难吗?好学吗?
热门文章
- 苹果开发者被盯上了!Xcode又双叒叕被攻击了
- 独家:为了永不停机的计算服务 - 四月月刊 | 凌云时刻
- 一文看懂:边缘计算究竟是什么?为何潜力无限?(下)
- 跨5合并dnf无限连接服务器,不妨一试!跨5等跨区卡登陆卡黑屏解决办法分享
- python分类识别_Python构建图像分类识别器的方法
- 【基音频率】基音matlab基音频率计算【含Matlab源码 1384期】
- 【优化算法】头脑风暴优化算法(BSO)【含Matlab源码 497期】
- element ui后台html_Github上10 个优秀的后台控制面板
- 人工智能 企业变革_我们如何利用(人工)情报变革医院的运营管理
- 词嵌入生成词向量_使用词嵌入创建诗生成器