python 快速排序(Quick Sort)
快速排序(Quick Sort)
快速排序是一种高效的排序算法,采用分治法(Divide and Conquer)策略。它的基本思想是:选择一个基准元素(pivot),将数组分为两部分,使得左边部分的元素都小于基准元素,右边部分的元素都大于基准元素,然后递归地对左右两部分进行排序。
快速排序的步骤:
- 选择基准元素:从数组中选择一个元素作为基准(通常选择第一个、最后一个或中间元素)。
- 分区操作:将数组分为两部分,左边部分的元素小于基准元素,右边部分的元素大于基准元素。
- 递归排序:对左右两部分递归地应用快速排序。
- 合并结果:由于分区操作已经保证了左边部分小于右边部分,最终数组自然有序。
时间复杂度:
- 最坏情况:O(n²) —— 当每次选择的基准元素都是最小或最大元素时。
- 最好情况:O(n log n) —— 当每次选择的基准元素都能将数组均匀分为两部分时。
- 平均情况:O(n log n)
空间复杂度:
- O(log n) —— 递归调用栈的深度。
Python 实现
def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2] # 选择中间元素作为基准left = [x for x in arr if x < pivot] # 小于基准的部分middle = [x for x in arr if x == pivot] # 等于基准的部分right = [x for x in arr if x > pivot] # 大于基准的部分return quick_sort(left) + middle + quick_sort(right) # 递归排序并合并# 示例使用
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort(arr)
print("排序后的数组:", sorted_arr)
输出结果
排序后的数组: [1, 1, 2, 3, 6, 8, 10]
快速排序的详细过程
以数组 [3, 6, 8, 10, 1, 2, 1] 为例:
-
第一轮:
- 选择基准元素
10(假设选择最后一个元素)。 - 分区结果:
- 左边部分:
[3, 6, 8, 1, 2, 1] - 右边部分:
[]
- 左边部分:
- 递归排序左边部分。
- 选择基准元素
-
第二轮:
- 选择基准元素
1(左边部分的最后一个元素)。 - 分区结果:
- 左边部分:
[] - 右边部分:
[3, 6, 8, 2]
- 左边部分:
- 递归排序右边部分。
- 选择基准元素
-
第三轮:
- 选择基准元素
2(右边部分的最后一个元素)。 - 分区结果:
- 左边部分:
[] - 右边部分:
[3, 6, 8]
- 左边部分:
- 递归排序右边部分。
- 选择基准元素
-
第四轮:
- 选择基准元素
8(右边部分的最后一个元素)。 - 分区结果:
- 左边部分:
[3, 6] - 右边部分:
[]
- 左边部分:
- 递归排序左边部分。
- 选择基准元素
-
第五轮:
- 选择基准元素
6(左边部分的最后一个元素)。 - 分区结果:
- 左边部分:
[3] - 右边部分:
[]
- 左边部分:
- 递归排序左边部分。
- 选择基准元素
-
合并结果:
- 最终排序结果为
[1, 1, 2, 3, 6, 8, 10]。
- 最终排序结果为
快速排序的优缺点
优点:
- 平均时间复杂度为 O(n log n),性能优异。
- 是原地排序算法,不需要额外的存储空间。
- 在实际应用中表现良好,是常用的排序算法之一。
缺点:
- 最坏情况下时间复杂度为 O(n²),但可以通过优化基准选择策略来避免。
- 不是稳定的排序算法(相同元素的相对位置可能改变)。
优化快速排序
-
随机选择基准元素:
- 避免最坏情况的发生,提高算法的稳定性。
-
三数取中法:
- 选择第一个、最后一个和中间元素的中位数作为基准。
-
小数组使用插入排序:
- 当数组规模较小时,插入排序的效率更高。
优化后的快速排序实现
import randomdef quick_sort_optimized(arr):if len(arr) <= 1:return arrpivot = random.choice(arr) # 随机选择基准元素left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort_optimized(left) + middle + quick_sort_optimized(right)# 示例使用
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort_optimized(arr)
print("优化后的排序数组:", sorted_arr)
总结
快速排序是一种高效的排序算法,适用于大规模数据的排序。通过优化基准选择策略,可以进一步提高其性能和稳定性。
相关文章:
python 快速排序(Quick Sort)
快速排序(Quick Sort) 快速排序是一种高效的排序算法,采用分治法(Divide and Conquer)策略。它的基本思想是:选择一个基准元素(pivot),将数组分为两部分,使得…...
MySQL数据库——常见慢查询优化方式
本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 文章目录 什么是慢查询日志?慢查询日志的相关参数如何启用慢查询日志?方式一:修改配置文件方式二:通过命令动态启用 分析慢查询日志方式一:直…...
【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火
:羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言: 在当今数字化的时代,人工智能生成内容(AIGC)正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师,…...
C语言性能优化:从基础到高级的全面指南
引言 C 语言以其高效、灵活和功能强大而著称,被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而,要写出高性能的 C 语言代码,需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术,并通过…...
常用的公共 NTP(网络时间协议)服务器
公共 NTP 服务列表 以下是一些常用的公共 NTP(网络时间协议)服务器,供您参考: 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器:ntp.ntsc.ac.cn中国 NTP 快速授时服务:cn.ntp.org.cn阿里云公共 NTP 服务…...
Kafka中的Topic和Partition有什么关系?
大家好,我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系?】面试题。希望对大家有帮助; Kafka中的Topic和Partition有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…...
Unity 使用UGUI制作卷轴开启关闭效果
视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …...
MarkDown怎么转pdf;Mark Text怎么使用;
MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…...
整合版canal ha搭建--基于1.1.4版本
开启MySql Binlog(1)修改MySql配置文件(2)重启MySql服务,查看配置是否生效(3)配置起效果后,创建canal用户,并赋予权限安装canal-admin(1)解压 canal.admin-1…...
QGIS移动图元功能
有时需要在QGIS里面移动一些矢量图层,比如图层的地理配准,网上搜了一些资料没有查看,后来仔细找了下,在编辑-编辑几何图形-移动要素里面,可以移动图层。 注意:移动前先要选择上要移动的图层,之…...
【模电刷题复习--填空】
如有错误,欢迎各位大佬在评论区批评指正 模电刷题 一、填空题1.本征半导体中,若掺入微量的__五__价元素,则形成___n___型半导体,其多数载流子是自由电子,若掺入微量的__三__价元素,则形成__p__型半导体。其…...
shardingsphere-jdbc-core-spring-boot-starter的性能问题(理论)
hardingSphere-JDBC-core-spring-boot-starter 是 ShardingSphere 提供的与 Spring Boot 集成的模块,用于实现数据库的分库分表等功能。在性能方面,它既有优势也存在一定的挑战,以下是具体分析: 优势方面 数据分片提升查询性能 通…...
Java Map 集合详解:基础用法、常见实现类与高频面试题解析
在 Java 集合框架中,Map 是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解 Map 的用…...
一款基于.Net方便、快捷的数据库文档查询、生成工具
项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具!从最初仅支持SqlServer数据库、CHM文档格式开始,通过不断地探索开发、集思广益和不断改进,又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式的导出。同时又…...
Linux平台下实现的小程序-进度条
目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n:换行回车(\r:回车) 2.缓冲区 如下图在vim编辑器中的命令模式下…...
Ubuntu 22.04.5 修改IP
Ubuntu22.04.5使用的是netplan管理网络,因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改,需要权限,使用sudo vim或者其他编辑器,修改后的内容如下: # Let NetworkManager manage all devices on …...
解决virtualbox出现开启DHCP之后ubuntu虚拟机之后IP重复的问题
找遍了国内论坛,没一个能解决该问题的,所以我自己写个文章吧,真讨厌那些只会搬运的,污染国内论坛环境,搜一个问题,千篇一律。 问题 操作系统版本为"Ubuntu 24.04 LTS" lennytest1:~$ cat /etc…...
Java开发工具-Jar命令
Java开发工具-Jar 1、jar命令全平台使用 2、jar命令的作用 为类和资源创建存档,并从存档中操作或恢复单个类或资源 3、摘要 jar [OPTION …] [ [–release VERSION] [-C dir] files] … 4、jar命令描述 jar命令通常作为用于压缩与解压的工具,基于ZIP或Z…...
UE5通过蓝图节点控制材质参数
通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中,控制材质的参数值和向量值...
敖行客年终总结-AT Work 1.0发布
2024年就要过去了,看看敖行客这一年都干了些啥? 敖行客团队通过整整一年的努力,正式推出了AT Work 1.0订阅版,这也标志着AT Work即将正式和C端的小伙伴见面了。 AT Work 是什么? 长期以来,软件研发成本、…...
搞懂专业代剪辑,才能看懂好视频背后的逻辑
为什么你拍的素材总剪不出‘电影感’? 你是否也经历过这样的困扰:婚礼当天拍了上百G的高清素材,回家却剪不出那支朋友圈点赞破百的高光快剪;或是为新品拍摄了完整开箱视频,上传后播放量寥寥?问题往往不在拍…...
Anthropic 收购 Stainless:加强开发者基础设施控制,或重塑 AI 竞争格局
收购背景与目的随着人工智能供应商竞相简化智能体开发,Anthropic 收购了初创公司 Stainless,这笔交易让 Anthropic 能更严格地控制开发者将 Claude 接入软件和业务系统的方式。图片来源:T. Schneider / Shutterstock。分析人士称,…...
如何用ComfyUI-Impact-Pack实现AI图像精细化处理:从面部修复到高分辨率增强的完整指南
如何用ComfyUI-Impact-Pack实现AI图像精细化处理:从面部修复到高分辨率增强的完整指南 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, …...
今日算法(二叉树剪枝)
题目描述给你二叉搜索树的根节点 root,同时给定最小边界 low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在 [low, high] 中。修剪树不应该改变保留在树中的元素的相对结构(即如果没有被移除,原有的父子代关系都应当保…...
【干货】如何从软件测试转型为AI测试开发?这份面试题指南值得你一看!
你是软件测试从业者,但想转向人工智能测试开发岗位吗? AI 测试岗位不仅考察传统测试技能,还要求你理解 AI/ML 模型特性、设计测试流程、编写自动化脚本。 今天,我们整理了一份面试题,从基础概念到实战场景࿰…...
这几家有机膨润土厂家口碑稳定,你选对了吗?
在工业与新材料领域,有机膨润土作为一种关键的功能性添加剂,正从“幕后”走向“台前”。无论是涂料、油墨的流变控制,还是钻井液、润滑脂的耐温需求,又或是农药、兽药的载体优化,它的身影无处不在。然而,面…...
Vivado用户必看:中文用户名导致Vscode关联失效?手把手教你修改vivado.xml文件
Vivado与Vscode联动的终极解决方案:彻底攻克中文路径兼容性问题 在FPGA开发领域,Vivado作为Xilinx推出的旗舰级开发工具,与轻量级代码编辑器Vscode的联动已经成为提升开发效率的标准配置。然而,许多中文用户在实际操作中常常遇到…...
Perplexity语言学习资源实战手册:7天掌握高效外语输入+输出闭环的3大核心技巧
更多请点击: https://intelliparadigm.com 第一章:Perplexity语言学习资源的核心定位与适用场景 Perplexity 作为一款以深度推理与实时信息整合见长的AI协作工具,其语言学习资源并非传统词典或语法教程的简单复刻,而是聚焦于**真…...
Logstalgia高级配置技巧:自定义颜色、分组和过滤规则
Logstalgia高级配置技巧:自定义颜色、分组和过滤规则 【免费下载链接】Logstalgia replay or stream website access logs as a retro arcade game 项目地址: https://gitcode.com/gh_mirrors/lo/Logstalgia Logstalgia是一款将网站访问日志以复古街机游戏形…...
PHP主流框架
PHP主流框架概述 PHP作为广泛使用的服务器端脚本语言,拥有多个成熟的开发框架,适用于不同规模和类型的项目。以下是当前主流的PHP框架及其特点: Laravel Laravel是目前最流行的PHP框架之一,以其优雅的语法和丰富的功能著称。它提供了强大的路由系统、ORM(Eloquent)、模…...
