python 快速排序

【Python】快速排序 “分而治之”是一种强大而普适的算法设计范式,它将一个难以直接解决的大问题,分解为两个或多个与原问题形式相同、但规模更小的子问题,然后递归地解决这些子问题。当子问题的解被求出后,再将它们合并,从而得到原问题的解。快速排序是“分而-治之”思想最经典、最纯粹的体现。它的整个生命周期,都围绕着一个核心动作展开:分割(Divide): 这是快速排序的灵魂。从待排序的数组(或子数组)中,挑选出一个元素,我们称之为**“基准”(Pivot)。然后,重新排列数组中的其他所有元素,使得所有小于基准的元素都被移动到基准的左边, 阅读详情

一、快速排序算法

快速排序实现基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。

二、快速排序流程

(1) 从数列中挑出一个基准值。
(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
(3) 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。

例如,对无序表{49,38,65,97,76,13,27,49}进行快速排序,大致过程为:

  1. 首先从表中选取一个记录的关键字作为分割点(称为“枢轴”或者支点,一般选择第一个关键字),例如选取 49;
  2. 将表格中大于 49 个放置于 49 的右侧,小于 49 的放置于 49 的左侧,假设完成后的无序表为:{27,38,13,49,65,97,76,49};
  3. 以 49 为支点,将整个无序表分割成了两个部分,分别为{27,38,13}和{65,97,76,49},继续采用此种方法分别对两个子表进行排序;
  4. 前部分子表以 27 为支点,排序后的子表为{13,27,38},此部分已经有序;后部分子表以 65 为支点,排序后的子表为{49,65,97,76};
  5. 此时前半部分子表中的数据已完成排序;后部分子表继续以 65为支点,将其分割为{49}和{97,76},前者不需排序,后者排序后的结果为{76,97};
  6. 通过以上几步的排序,最后由子表{13,27,38}、{49}、{49}、{65}、{76,97}构成有序表:{13,27,38,49,49,65,76,97};

整个过程中最重要的是实现第 2 步的分割操作,具体实现过程为:

  • 设置两个指针 low 和 high,分别指向无序表的表头和表尾,如下图所示:
    在这里插入图片描述
  • 先由 high 指针从右往左依次遍历,直到找到一个比 49 小的关键字,所以 high 指针走到 27 的地方停止。找到之后将该关键字同 low 指向的关键字进行互换:
    在这里插入图片描述
  • 然后指针 low 从左往右依次遍历,直到找到一个比 49 大的关键字为止,所以 low 指针走到 65 的地方停止。同样找到后同 high 指向的关键字进行互换:
    在这里插入图片描述
  • 指针 high 继续左移,到 13 所在的位置停止(13<49),然后同 low 指向的关键字进行互换:
    在这里插入图片描述
  • 指针 low 继续右移,到 97 所在的位置停止(97>49),然后同 high 指向的关键字互换位置:
    在这里插入图片描述
  • 指针 high 继续左移,此时两指针相遇,整个过程结束;

三、代码实现(python)

def quick_sort(num_list, first, last):
    if first >= last:
        return
    p = first
    q = last

    while q > p:
        if num_list[q] >= num_list[first]:
            q -= 1
        elif num_list[p] < num_list[first]:
            p += 1
        else:
            num_list[p], num_list[q] = num_list[q], num_list[p]
    num_list[p] = num_list[first]

    quick_sort(num_list, first, q-1)
    quick_sort(num_list, q+1, last)


if __name__ == '__main__':
    num_list = [44, 23, 1, 14, 6, 9, 4, 5, 33]
    length = len(num_list)
    quick_sort(num_list, 0, length - 1)
    print(num_list)

四、时间复杂度和空间复杂度

1、快速排序算法的性能
在这里插入图片描述
2、时间复杂度
当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。

而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。

3、空间复杂度
快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 logN次的分割处理,所以占用空间也是 logN 个。

4、算法稳定性
在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。

五、对用的视频学习资料

https://www.bilibili.com/video/BV1ZW411q7vE?p=3

【python算法系列二】快速排序算法 快速排序的思想是:取数组中的一个数作为基准值,把所有小于基准值的数都放在它的一侧,再把所有大于基准值的数都放在它的另一侧。随后,对基准值左右两侧的数组分别进行快速排序。由此可以看出,快速排序的整个排序过程也是递归进行的。 快速排序的平均时间复杂度是 O(nlgn),最好情况下的时间复杂度是 O(nlgn)。最坏情况下,快速排序的时间复杂度可能退化成 O(n2),但这种情况很少见。它的空间复杂度是 O(nlgn)。它是一个不稳定的排序算法。如果使用得当,快速排序的速度可以达到归并排序和堆排序的数倍,所以. 阅读详情

相关推荐

我看MFC的过去、现在和未来

首先说句题外话,虽然我现在的“主业”是Qt,但自己扪心自问,对MFC的熟悉程度要超过Qt。正是由于有了对MFC的熟悉,才能在使用Qt时,比较清醒的认清两者的优劣之处,在此暂且不提。 这个话题也可以说是由来已久,众说纷纭,今时我也谈谈自己的感悟。 一、对MFC的总体看法 首先看看云风在其《游戏之旅-我的编程感悟》一书中对MFC的看法: “我所见到的程序员中,很多把C+

qter_wd007的专栏 6115

Python实现快速排序

Python实现快速排序

weixin_43790276的博客 3万+

Win7/Win10双系统兼容指南:Arduino IDE 1.8.19与2.3.2的安装避坑全攻略

本文详细解析了在Win7/Win10双系统环境下安装和配置Arduino IDE 1.8.19与2.3.2版本的完整指南,特别针对ESP32开发环境的深度配置和COM端口常见问题提供了实用解决方案。通过版本对比、安装优化和性能调优,帮助开发者高效搭建稳定的物联网开发环境。

weixin_30500105的博客 187

python排序算法——快速排序(附代码)

(附详细代码)快速排序的平均时间复杂度是O(nlgn),最好情况下的时间复杂度是O(nlgn)。最坏情况下,快速排序的时间复杂度可能退化成O( n2 ),但这种情况很少见。它的空间复杂度是O(nlgn)。它是一个不稳定的排序算法。

阿极的博客 9505

必看!wechat-article-exporter:轻松批量下载公众号文章

微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。

王乐平 技术博客 4355

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 975

快速排序详解(附python实现)

快速排序(Quicksort)是对冒泡排序的一种改进,由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程递归进行,以此使整个数据变成有序序列。 快速排序的核心思想是划分(partion)和分治(divide and con...

zhang123454lulu的博客 3673

Squareline Studio + LVGL实战:从Figma设计到MCU屏幕的UI开发一条龙(避坑中文显示)

本文详细介绍了使用Squareline Studio和LVGL实现从Figma设计到MCU屏幕UI开发的全流程,重点解决中文显示等常见问题。通过设计工具链搭建、设计稿转换、LVGL工程集成及性能优化等步骤,帮助开发者高效完成嵌入式GUI开发,提升开发效率。

weixin_29246195的博客 584

python算法 之 快速排序(Quick Sort)

快速排序(Quick Sort)是一种基于分治思想的排序算法,是目前使用最广泛的排序算法之一。其基本思想是选取一个基准元素,然后将数组分成小于等于基准的子数组和大于基准的子数组,再递归地对这两个子数组进行快速排序,最后将它们合并起来即可。划分操作采用两种方式:Lomuto 分割和 Hoare 分割。

风华浪浪的博客 6333

混响效果的编程实现:Schroeder混响模型与Moorer型混响

Schroeder混响模型是由Manfred R. Schroeder在1962年提出的,它基于一系列串联的反射器(Allpass Comb Filters)和并联的反射器(Feedback Comb Filters)构成。Schroeder混响模型是由Manfred R. Schroeder在1962年提出的,它基于一系列串联的反射器(Allpass Comb Filters)和并联的反射器(Feedback Comb Filters)构成。通过调整各个反射器和全通滤波器的参数,可以实现不同的混响效果。

2301_79326857的博客 1082

【WorkBuddy专栏09】WorkBuddy多模态能力深度揭秘

【WorkBuddy专栏09】AI不止会聊天——WorkBuddy多模态能力深度揭秘

AI人人懂 2113

快速排序python实现

快速排序python实现 快速排序相比起前面介绍的直接选择排序、直接插入排序、冒泡排序、希尔排序更加高效,下面使用python实现这个算法。 算法思想 快速排序的核心思想在于:首先在这个序列中随便找一个数作为基准数,然后将这个序列中所有比基准数大的数放在该数字的右边,比基准数小的数放在该数字的左边。第一轮排序结束之后,再分别对已经好的基准书左边(比基准数小)和基准书右边(比基准书大)的数字序列重复...

如切如磋 4131

LPDDR6 技术标准详解(JESD209-6)

是继 LPDDR5/5X 之后的新一代低功耗 DRAM 标准,专为满足移动终端、AI、边缘计算等高带宽、低功耗场景而设计。该标准通过全新架构、动态功耗控制机制和增强型数据完整性机制,实现性能、能效与可靠性的全面升级。LPDDR6 并非仅是速度升级,更是内存架构设计思路的演进,围绕“低功耗 + 高带宽 + 强安全”的三维目标,构建下一代 SoC 平台关键基础。✅ 高带宽:支持 32B/64B 动态突发✅ 低功耗:动态电压、通道切换✅ 高可靠性:ECC + 自测试 + 安全区。

weixin_43199439的博客 2580

python快速排序的原理_python 实现快速排序

Python排序算法之快速排序快速排序(quickSort)快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。百度百科给的算法:一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];3)从j开始...

weixin_39840111的博客 270

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

快速排序 python 代码实现

原理: 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。    快速排序:是给基准数据找其正确索引位置的过程.  ...

weixin_40294256的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何用Python实现快速排序

快速排序是一种实用的排序算法,它的时间复杂度相对较低,而且可以在大部分情况下保持较好的性能。在Python中,我们可以使用递归的方式实现快速排序。同时,我们还可以定义一个用于比较两个元素大小的函数来优化快速排序的性能。

qq_28245087的博客 2343

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python|简单的快速排序

欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。问题描述快速排序作为排...

算法与编程之美 1763

python交换排序之快速排序

python交换排序之快速排序

weixin_43579528的博客 592

快速排序:Python语言实现

快速排序是一种常用的排序算法,比选择排序快得多。例如,C语言标准库中的函数qsort 实现的就是快速排序。像归并排序(merge sort)一样,快速排序也是一种分治的递归算法。

Saki_Python的博客 1329

[Python]快速排序

最近摸了下Pyhton,发现真心好用。写下快排来练手。 import random def partition(a,lo,hi): i = lo j = hi+1 v = a[lo] while True: while a[i]<v: i = i+1 if i == hi: break j = j-1 ##特别注意 whil

CiaoLiang的专栏 1425

python快速排序

关于利用python进行快速排序 鄙人新人一个,目前正在学习中,不喜勿喷 当然也欢迎志同道合之人一起学习,一起进步 我们或多或少接触过排序问题,但是当数据过于庞大时,普通的排序方法(冒泡,选择,插入)在时间和占用内存的角度来说是处于一种劣势地位【极特殊情况除外】 步骤: 1.从数列中挑出一个元素,称为 "基准"(pivot), 2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位

m0_68029173的博客 967

python快速排序代码_Python3 实现快速排序

"""# @Date: 2018-4-10# @Project: 算法# @Filename: quicksort.py# @Last modified by: songhao# @Copyright: 网址:www.168seo.cn 微信公众号:zeropython"""def quick_sort(alist, start, end):"""快速排序#在对快速排序优化的时候牢记一点:...

weixin_39769627的博客 77

python快速排序_Python快速排序

python快速排序Here you get python quick sort program and algorithm. 在这里,您将获得python快速排序程序和算法。 Quick sort is based on divide and Conquer technique. We divide our array into sub-arrays and that sub-arrays ...

culing2941的博客 446

快速排序 python 4种写法_快速排序的python多种实现

问题快速排序,这是一个经典的算法,本文给出几种python的写法,供参考。特别是python能用一句话实现快速排序。思路说明快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子...

weixin_39927158的博客 505

python排序链表快速排序算法_Python排序算法之快速排序

转自:https://www.cnblogs.com/AlwinXu/p/5424905.html快速排序(quickSort)快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。百度百科给的算法:一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个...

weixin_39841136的博客 395
上一篇: python调整数组顺序使奇数位于偶数前面
下一篇: python 合并排序的数组
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶知秋的BLOG

创作不易 请多多关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值