python快速排序代码_快速排序的Python实现-程序员宅基地

技术标签: python快速排序代码  

目录

快速排序的介绍

快速排序的Python实现

快速排序的介绍

快速排序(quick sort)的采用了分治的策略。

分治策略指的是:

将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

快排的基本思想是:

在序列中找一个划分值,通过一趟排序将未排序的序列排序成 独立的两个部分,其中左边部分序列都比划分值小,右边部分的序列比划分值大,此时划分值的位置已确认,然后再对这两个序列按照同样的方法进行排序,从而达到整个序列都有序的目的。

快速排序的Python实现

先来看一个 我更想称之为伪快排的快排代码:

def quick_sort(array):

if len(array) < 2:

return array

else:

pivot = array[0]

less_than_pivot = [x for x in array if x <= pivot]

more_than_pivot = [x for x in array if x > pivot]

return quick_sort(less_than_pivot) + [pivot] + quick_sort(more_than_pivot)

这段代码最关键的是pivot这个参数,这段代码里取序列的第一个元素,然后以这个元素为分组的基准,利用列表解析式使得它左边的值都比它小,右边的值都比它大。然后再分别对这些序列进行递归排序。

这段代码虽然短小利于理解,但是其效率很低,主要体现在以下方面:

分组基准的选取过于随便,不一定可以取到列表的中间值

空间复杂度大,使用了两个列表解析式,而且每次选取进行比较时需要遍历整个序列。

若序列长度过于小(比如只有几个元素),快排效率就不如插入排序了。

递归影响性能,最好进行优化。

下面用Python写一个C风格的快排(这里可以体会到快排的精髓):

def quick_sort(L):

return q_sort(L, 0, len(L) - 1)

def q_sort(L, left, right):

if left < right:

pivot = Partition(L, left, right)

q_sort(L, left, pivot - 1)

q_sort(L, pivot + 1, right)

return L

def Partition(L, left, right):

pivotkey = L[left]

while left < right:

while left < right and L[right] >= pivotkey:

right -= 1

L[left] = L[right]

while left < right and L[left] <= pivotkey:

left += 1

L[right] = L[left]

L[left] = pivotkey

return left

L = [5, 9, 1, 11, 6, 7, 2, 4]

print quick_sort(L)

快速排序需要提供三个参数:待排序序列 、序列最小下标值left、序列最大下标值right。让用户提供这三个参数很麻烦。这里写个函数进行封装:

def quick_sort(L):

return q_sort(L, 0, len(L) - 1)

下面看一下q_sort函数:

def q_sort(L, left, right):

if left < right:

pivot = Partition(L, left, right)

q_sort(L, left, pivot - 1)

q_sort(L, pivot + 1, right)

return L

这个函数的核心是pivot = Partition(L, left, right),在执行它之前,列表的值为[5, 9, 1, 11, 6, 7, 2, 4],而Partition函数做的事情是找到一个分组标准,然后进行分组,让它左边的值比它小,右边的值比它大。

在经过Partition函数分组后,列表变为[4, 2, 1, 5, 6, 7, 11, 9],并把5的下标值(也就是3)返回给pivot,此时列表变成两个小列表[4, 2, 1]和[5, 6, 7, 11, 9] ,之后调用q_sort,就是调用q_sort(L,0, 2)和q_sort(L, 4 ,7),对其进行Partition操作,直到整个列表有序为止。

下面看看关键的Partition函数是如何做的:

def Partition(L, left, right):

pivotkey = L[left]

while left < right:

while left < right and L[right] >= pivotkey:

right -= 1

L[left] = L[right]

while left < right and L[left] <= pivotkey:

left += 1

L[right] = L[left]

L[left] = pivotkey

return left

以一趟排序为例[5, 9, 1, 11, 6, 7, 2, 4]:

开始排序时,left=0,right=7,首先用表的第一个下标值作为 分组关键字pivot,

2b2f1f79984e

第一趟排序过程

进行while left < right and L[right] >= pivotkey:判断,其中L[right]=4 不满足条件,跳出循环,执行L[left] = L[right],执行后列表变成:

2b2f1f79984e

第一趟排序结果

然后进行while left < right and L[left] <= pivotkey:,L[left] = 4 <= 5,条件成立,left向右边移动,然后L[left] = 9 不满足条件,执行L[right] = L[left],执行后列表变为:

2b2f1f79984e

第一趟排序过程

然后进行while left < right判断,条件成立,继续进行判断while left < right and L[right] >= pivotkey:,L[right] = 9,满足条件,right向左移动1,继续判断,不满足条件,执行L[left] = L[right],执行后列表变为:

2b2f1f79984e

第一趟排序过程

然后进行while left < right and L[left] <= pivotkey:判断,L[left] = 2,满足条件,left向右移动,然后L[left] = 1,满足条件,left向右移动,L[left] = 11,不满足条件,执行L[right] = L[left],执行后列表变为:

2b2f1f79984e

第一趟排序过程

然后进行while left < right 判断,条件成立,继续进行判断:while left < right and L[right] >= pivotkey:,满足条件,right向左移动,一直移动到这样的状态:

2b2f1f79984e

第一趟排序过程

此时不满足条件:left < right,跳出循环。然后执行L[left] = pivotkey,并返回left下标值。此时序列变为:

2b2f1f79984e

第一趟排序结果

接下来就是用递归分别对子列表进行排序。读者可以自己试试。

问题的优化

分组基准

对于上面的代码,分组基准的选取只是取列表的第一个值,太过于随便,当取到序列的中间值时,快排效率是最高的,第一个值未必是列表的中间值。为了解决这个问题,我们可以选取列表中的几个值进行简单的比较,然后取这几个值的中间值 作为分组基准。 这里就不写代码了,读者可以自己实现。

空间使用大。

上面的代码已经解决了比较次数的问题。

若序列长度过于小(比如只有几个元素),快排效率就不如插入排序了。

我们可以设置一个列表元素大小的临界值,若小于这个值,就用插入排序,大于这个值用快排。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39691968/article/details/109934731

智能推荐

神舟刷蓝天w650dbios_神舟Z7-CT7NA刷入蓝天BIOS破除40W功耗墙-程序员宅基地

文章浏览阅读3.7k次。①功耗墙功耗墙是笔记本常见的,台式机也有功耗墙,举个栗子,当你把9900K插在H310上,通常H310是四相供电,一相按20W计算的话,可以给供电给CPU80W,不考虑其他因素,只考虑默频CPU的话,负载用不到80W的前提,那确实没问题,现在游戏基本50-70W的CPU需求,但负载特别高,需要80W以上的时候,主板供电供不起来,那么处理器就会疯狂降频,台式机解决墙是用高规格的主板,所以为什么990..._蓝天w650dcbios设置

VALL-E X语音大模型,支持跨语言文本语音合成、语音克隆-程序员宅基地

文章浏览阅读1.9k次,点赞45次,收藏26次。本文提出了一种跨语言神经编解码器语言模型VALL-E X,用于跨语言语音合成。该模型可以通过使用源语言语音和目标语言文本作为提示来预测目标语言语音的声学令牌序列。实验结果表明,VALL-E X可以通过仅使用源语言语音作为提示来生成高质量的目标语言语音,同时保留未见过的说话者的声音、情感和声学环境。此外,VALL-E X有效地缓解了外语口音问题,可以通过语言ID进行控制。_vall-e

word2016自带公式编辑器转换成mathtype类型公式,以及设置公式大小_word2016对应mathtype公式编辑器版本-程序员宅基地

文章浏览阅读7.9w次,点赞22次,收藏84次。投稿时需要mathtype类型公式,而我是用word自带的公式编辑器,所以凉凉了。一、公式转换打开要转换的文件,选中要转换的公式,选择mathtype的转换公式勾选第四个选项出现问题:其中官网给出的解决方案不靠谱我的omml2mml.xsl位于C:\Program Files (x86)\Microsoft Office\root\Office16,将该文件复制到C:\Program Files ..._word2016对应mathtype公式编辑器版本

深入理解c++之struct构造函数_c++ struct 构造函数-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏15次。 是否曾好奇struct定义的数据结构类型,当我拷贝构造时,或者赋值操作时会发生什么?倘若我结构中存在指针引用对象时,又能否正确处理?带着这些疑问,我们来对struct的构造函数进行研究,以解答以下几个疑问: 1) 何时编译器会自动为struct合成构造函数 2) 如何能保证携带指针引用对象的struct正确拷贝或拷贝构造 让我们..._c++ struct 构造函数

WPF---RenderTransform图形旋转,缩放_wpf 旋转角度-程序员宅基地

文章浏览阅读3.3k次。WPF的RenderTransform类:RotateTransform:能够让某对象产生旋转变化,根据中心点进行顺时针旋转或逆时针旋转。ScaleTransform:能够让某对象产生缩放变化。现在用两个 button做例子,分别是旋转和缩放的前台代码,其实都是一样的方法,先设置button的RenderTransform属性,然后建立一个画板,让它实现永久的动画。下面是一个旋转的例子: ..._wpf 旋转角度

在海量数据中找到最大的前K个数(top K问题)_给2000万个数,找到最大的前k个数,时间复杂度-程序员宅基地

文章浏览阅读2.6k次。问题分析:数据是海量的,可能达到10亿或者100亿以上,只需要找最大的前100个数。所以将数据一次性排序然后取前100个是不太可取的操作。做了很多无用功,并且内存一次性也加载不了海量数据。解决方案:方案一:堆。一般说在很多数据中取前多少个数据,我们都会想到堆,这里我们使用堆来解决问题。首先取K个数建立一个小根堆(堆顶是堆中最小的元素),建堆的时间复杂度是O(KlgK),这个时间复杂度..._给2000万个数,找到最大的前k个数,时间复杂度

随便推点

Python用Pillow库读取或保存16位RAW图像_用python读取16bit raw格式-程序员宅基地

文章浏览阅读391次。Python,如何用Pillow库读取或保存16位RAW图像_用python读取16bit raw格式

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容,Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布,主要用于根据文本的描述产生详细图像,当然它也可以应用于其他任务,比如内补绘制、外补绘制,以及在提示词指导下,对现有图形进行风格化或转变。Stable Diffusion 模型版本正在快速迭代,开源生态也在逐步扩展,对行业生产力带来了巨大的变革。

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

流量控制:接收方控制发送方,不让发送方发送的太多,太快以致于让接收方的缓冲区溢出。

kubebuilder(5)制作镜像&部署

使用项目自带的deploy指令,这种方式是将operator部署到本地集群中,其实和make run差不多。然后,默认的这个FROM gcr.io/distroless/static:nonroot也是下不到的。所以啊,我们只要执行下这两行就可以得到我们想要的yaml文件,然后就可以随便到别的集群执行了哦。也可修改~/.kube/config来连接其他集群,但还是太麻烦。我们需要的当然是把写的operator分发到别的集群部署。如果你的部署遇到问题,可能会遇到镜像下载不下来的问题。去别的集群,部署试试。

【SVM回归预测】鲸鱼算法优化卷积神经网络结合支持向量机WOA-CNN-SVM数据回归预测【含Matlab源码 3775期】-程序员宅基地

文章浏览阅读17次。鲸鱼算法优化卷积神经网络结合支持向量机WOA-CNN-SVM数据回归预测完整的代码,方可运行;可提供运行操作视频!适合小白!

stm32到入土(一)RCC 配置 包含代码demo-程序员宅基地

文章浏览阅读306次,点赞4次,收藏7次。介绍了 stm32 RCC时钟的配置