【手撕算法】快速排序(递归分治法)Python实现

news2025/2/23 19:09:56

一、算法

class Solution:

    def Partition(self, nums, low, high):
        pivotkey = nums[low]  # 元素copied, nums[low]空了出来
        while low < high:
            while low < high and nums[high] >= pivotkey:
                high = high - 1  # 直到找到一个nums[high]<pivotkey位置
            nums[low] = nums[high]  # 将其移到pivotkey的左边, High所指向的位置空了出来
            # 或者直到high移动到了low的位置,说明右边的值都大于pivotkey,不需要移动
            while low < high and nums[low] <= pivotkey:
                low = low + 1
            nums[high] = nums[low]  # 最终low指针指向的位置空了出来
        # 完成了一趟排序,pivot key 左边的小于都小于等于它,右边的大于等于它
        nums[low] = pivotkey
        return low  # 此时的low代表的是Pivotkey的位置(有序分界点)

    # 1. 快速排序(递归分治法),每次能确定一个元素的位置,我使用的pivot key默认是最左边的值
    def QuickSort(self, nums, low, high):
        if low < high:  # 递归终止条件:Low==high
            # print("low=", low, "high=", high)
            pivot_loci = self.Partition(nums, low, high)
            # print("pivot_loci: nums[", pivot_loci, "]=",nums[pivot_loci])
           
            # 再对左边进行sort
            self.QuickSort(nums, low, pivot_loci-1)
            # 再对右边进行sort
            self.QuickSort(nums, pivot_loci+1, high)
        

    def sortArray(self, nums: List[int]) -> List[int]:
        low = 0
        high = len(nums)-1
        self.QuickSort(nums, low, high)
        return nums

二、例子

在这里插入图片描述
在这里插入图片描述

三、时空复杂度

1、时间复杂度
平均/最好 O(nlogn) :每一轮确定一个元素(pivot_key)的位置(称作分区),因为总体使用的是递归分治法,不断把数组分裂成两半,所以在最理想的情况下,数组每次都对半分,递归的深度就是logn。那么每一层分区的时间 n 乘以这一层递归的深度 logn 就是总时间复杂度 nlogn.
最差 O(n^2) :上面说了最理想的情况是数组每次对半分,递归深度等于logn,所以如果不理想的情况,比如每次选的Pivot都是最小的或者最大的,把长度为n的数组分成了 1 和 n-1,那么递归的深度就变成了n。最差的总时间复杂度就是 n^2.

2、空间复杂度
O(logn): 递归栈的深度为logn (最好)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】联合体枚举的讲解

目录 ✨声明&#xff01;&#xff01;&#xff01;&#xff1a; 联合体与结构体只有一个区别&#xff0c;那就是内存存储方式不同 &#x1f495;1.联合体的声明 &#x1f495;2.联合体内存的存储 &#x1f495;3.联合体字节大小的计算 例题2&#xff1a; ✨4.枚举的声明…

2024最新股票系统源码 附教程

1.环境 环境 php7.4 sql 5.7 Nginx1.2 tomcat-8 redis 放行1-65535 2.创建5个网站。xxx.com替换你的域名 ftp.xxx.com api.xxx.com agent.xxx.com admin.xxx.com wap.xxx.com api设置反向代理 代理名称 api 目标URL http://127.0.0.1:8091 新建ftp 目录指向新建的…

绝缘子缺陷检测数据集

绝缘子缺陷检测数据集&#xff0c;2800张高清照片&#xff0c;已打好标签txt格式&#xff0c;可直接进行目标检测。7类标签&#xff1a;玻璃绝缘子&#xff0c;玻璃片脏污&#xff0c;玻璃片缺损&#xff0c;聚合物片脏污&#xff0c;聚合物片缺损&#xff0c;聚合物绝缘子&…

K8S - Access Control 机制介绍

作为开发人员&#xff0c; 我们通常会直接用root 帐号操作 k8s master node 里的kubectl 命令&#xff0c;并不能感知k8s 多用户权限管理存在。 即使自动化&#xff0c; 我们也会考虑用ansible 来远程操作master node… 所以大部分开发人员默认上是不用深入研究k8s的Access c…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

[数据结构]算法复杂度详解

文章目录 一、引言1、想象数据结构与算法的奇妙世界2、算法复杂度的轻松解读3、数据结构与算法的温馨寄语 二、轻松掌握复杂度基础1、时间复杂度&#xff1a;算法速度的衡量尺2、空间复杂度&#xff1a;算法占地的衡量尺3、常见的复杂度 三、复杂度的计算1、时间复杂度计算2、空…

联想键盘鼠标套装Liteon SK-8861 银丝带键盘、鼠标对码方法

知识点分析: 最近在IdeaCentre B520e、IdeaCentre A720等机型&#xff0c;标配2.4G无线键鼠套装&#xff1a;Liteon SK-8861。由三部分组成&#xff1a;USB接收器、鼠标、键盘。鼠标、键盘同时和USB接收器连接&#xff0c;未开箱时USB接收器包装在鼠标内。标配的键鼠套装不需要…

linux 内核代码学习(九)--Linux内核启动和文件系统

一个比较顺手的学习平台可以达到事半功倍的效果&#xff0c;这里使用的平台环境主要是利用了主机和从机间的文件共享&#xff0c;以及从机自带的编译环境可以比较顺利的编译busybox1.0版本&#xff0c;方便进行内核和文件系统的测试了学习。 主机环境&#xff1a;vmware7.0win1…

C语言 | Leetcode C语言题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; int numberOfArithmeticSlices(int* nums, int numsSize) {if (numsSize 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for (int i 2; i < numsSize; i…

Qt 模型视图(三):视图类QAbstractItemView

文章目录 Qt 模型视图(三):视图类QAbstractItemView1.基本概念1.1.使用现有视图1.2.使用模型1.3.使用模型的多个视图1.4.在视图之间共享选择 Qt 模型视图(三):视图类QAbstractItemView ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视…

高级I/O知识分享【5种IO模型 || select || poll】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前文 2&a…

无人机助力智慧农田除草新模式,基于YOLOv10全系列【n/s/m/b/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天&#xff0c;无人机喷洒药物已经不是一件新鲜事情了&#xff0c;在很多高危的工作领域中&#xff0c;比如高空电力设备除冰&#xff0c;电力设备部件传送更换等等&#xff0c;无人机都可以扮演非常出色的作用&#xff0c;前面回到老家一段时间&#xff0c;最近正…

算法题总结(一)——二分查找专题

二分查找 我们二分查找的本质就是每次能够通过中间值来进行分割&#xff0c;能够比较判断&#xff0c;查找到或者接近需要的数据&#xff0c;然后把一部分的数据丢弃掉。 原题 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中&#xff0c;熟练掌握和运用快捷键可以极大地提升工作效率&#xff0c;减少重复性操作所花费的时间。快捷键不仅可以加快编程速度&#xff0c;还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键&#xff0c;特别是强大的…

101012分页属性

4k页面 P&#xff08;有效位&#xff09;&#xff1a;1有效&#xff0c;0无效 R/W&#xff08;读写位&#xff09;&#xff1a;1可读可写&#xff0c;0可读 U/S&#xff08;权限位&#xff09;&#xff1a;1(User)&#xff0c;0(System) A&#xff08;物理页访问位&#xff…

医学数据分析实训 项目五 聚类分析--蛋白质消费结构分析--车辆驾驶行为指标

文章目录 项目五&#xff1a;聚类分析实践目的实践平台实践内容任务一&#xff1a;蛋白质消费结构分析步骤 任务一&#xff1a;蛋白质消费结构分析数据预处理&#xff08;四&#xff09;模型建立及优化KMeans 任务二 车辆驾驶行为&#xff08;四&#xff09;模型建立及优化 项目…

并发带来的对象一致性问题

多线程操作带来数据不一致情况分析&#xff0c;简单demo。 public class Object_IS {private Student_Object so new Student_Object("张三", 123);public static void main(String[] args) throws InterruptedException {Object_IS os new Object_IS();os.test1(…

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation&#xff09;论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比&#xff0c;MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…

输电线路缺陷检测数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)

输电线路数据集&#xff08;绝缘子自爆&#xff0c;破损&#xff0c;闪络&#xff0c;鸟巢&#xff0c;防震锤脱落五种缺陷&#xff09;包括&#xff1a; 1.绝缘子自爆 2.绝缘子破损绝、闪络 3.鸟巢 4.防震锤脱落 数据增强后的数量 对应数量&#xff1a;1828&#xff0c;1467&a…

类加载器详细介绍

类加载器我们要聊一个神秘而又重要的角色——Java类加载器。这家伙&#xff0c;就像是个超级英雄&#xff0c;总是在关键时刻挺身而出&#xff0c;为我们的Java程序提供强大的支持。我会尽量用简单易懂的方式来介绍它。 一 、类加载器介绍 1、类加载器是什么&#xff1f; 想象…