news 2026/8/11 8:55:19

快速排序的基本思想是选择一个基准元素,通过partition函数将数组划分为两部分:一部分比基准小,另一部分比基准大,然后递归地对这两个子数组进行排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
快速排序的基本思想是选择一个基准元素,通过partition函数将数组划分为两部分:一部分比基准小,另一部分比基准大,然后递归地对这两个子数组进行排序

快速排序的基本思想是选择一个基准元素,通过partition函数将数组划分为两部分:一部分比基准小,另一部分比基准大,然后递归地对这两个子数组进行排序。

defquick_sort(arr):iflen(arr)<=1:returnarrelse:pivot=arr[len(arr)//2]# 选择中间元素作为基准left=[xforxinarrifx<pivot]middle=[xforxinarrifx==pivot]right=[xforxinarrifx>pivot]returnquick_sort(left)+middle+quick_sort(right)

其平均时间复杂度为 $ O(n \log n) $,是同量级中性能最优的排序算法之一;最坏情况下(如数组已有序),时间复杂度退化为 $ O(n^2) $。快速排序是一种不稳定排序,相同元素的相对位置可能在排序过程中发生改变。

堆排序则是基于堆这种数据结构的排序方法。堆是一个完全二叉树的数组表示,分为大根堆和小根堆:

  • 大根堆:每个父节点的值 ≥ 其子节点,堆顶为最大值;
  • 小根堆:每个父节点的值 ≤ 其子节点,堆顶为最小值。

堆排序的核心步骤包括:

  1. 构建初始堆(以大根堆为例,将最大值置于堆顶);
  2. 将堆顶元素与末尾元素交换,输出该最大值;
  3. 调整剩余元素使其重新满足堆的性质;
  4. 重复上述过程直到所有元素有序。

堆排序的时间复杂度始终为 $ O(n \log n) $,空间复杂度为 $ O(1) $,属于原地排序,但也是不稳定排序
快速排序的原地版本通过在原数组上进行元素交换,并使用双指针技术来划分区间,避免创建额外的数组(如left,middle,right列表),从而将空间复杂度从 $ O(n) $ 优化到 $ O(\log n) $(仅用于递归调用栈)。

✅ 原地快排实现逻辑:

  1. 选择一个基准元素(pivot),通常选区间的第一个、最后一个或中间元素;
  2. 使用两个指针ij,在[low, high]范围内进行划分:
    • i从左向右找大于等于 pivot 的元素;
    • j从右向左找小于等于 pivot 的元素;
    • i < j,则交换arr[i]arr[j]
  3. 最终将基准元素放到正确位置(与ij重合的位置交换);
  4. 递归对左右两部分排序。

🧩 Python 实现代码(原地快排):

defquick_sort_inplace(arr,low=0,high=None):ifhighisNone:high=len(arr)-1iflow<high:# 分区操作,返回基准元素的最终位置pivot_index=partition(arr,low,high)# 递归排序基准左侧和右侧quick_sort_inplace(arr,low,pivot_index-1)quick_sort_inplace(arr,pivot_index+1,high)defpartition(arr,low,high):pivot=arr[low]# 选择第一个元素作为基准i=low+1# 左指针,从第二个元素开始j=high# 右指针,指向末尾done=Falsewhilenotdone:# 向右移动 i,直到找到大于等于 pivot 的元素whilei<=jandarr[i]<=pivot:i+=1# 向左移动 j,直到找到小于等于 pivot 的元素whilei<=jandarr[j]>=pivot:j-=1# 如果 i < j,则交换 arr[i] 和 arr[j]ifi<j:arr[i],arr[j]=arr[j],arr[i]else:done=True# 将基准元素放到正确位置arr[low],arr[j]=arr[j],arr[low]returnj# 返回基准位置# 示例使用arr=[3,6,8,10,1,2,1]quick_sort_inplace(arr)print(arr)# 输出: [1, 1, 2, 3, 6, 8, 10]

⚖️ 优缺点分析:

  • 优点
    • 空间复杂度仅为 $ O(\log n) $(递归深度);
    • 原地排序,节省内存;
    • 实际运行速度快,缓存友好。
  • 缺点
    • 不稳定排序(相同值可能改变顺序);
    • 最坏情况仍为 $ O(n^2) $(可通过随机化 pivot 改善)。

💡 提示:可进一步优化为“三路快排”或“随机选取 pivot”来应对重复元素多或有序输入的情况。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 14:36:42

仅限内部分享:大型项目中C#通信拦截器的10个关键应用场景

第一章&#xff1a;C#网络通信拦截器的核心机制C#网络通信拦截器是实现高级网络控制与调试的关键组件&#xff0c;广泛应用于API监控、安全检测和性能分析场景。其核心机制依赖于对底层Socket通信的透明代理或Hook技术&#xff0c;通过重定向数据流来捕获、修改甚至阻断网络请求…

作者头像 李华
网站建设 2026/8/1 19:15:39

C#企业级模块划分实战指南(99%工程师忽略的关键设计点)

第一章&#xff1a;C#企业级模块划分的核心理念在构建大型C#应用程序时&#xff0c;合理的模块划分是确保系统可维护性、可扩展性和团队协作效率的关键。良好的模块设计不仅能够降低代码耦合度&#xff0c;还能提升单元测试的覆盖率和部署的灵活性。关注点分离 将系统按业务功能…

作者头像 李华
网站建设 2026/7/27 16:43:08

健身房会员卡识别:新用户注册时快速导入旧卡信息

健身房会员卡识别&#xff1a;新用户注册时快速导入旧卡信息 在健身房前台&#xff0c;一位刚搬来本地的会员正准备注册新账户。他掏出一张略显磨损的旧会员卡&#xff0c;工作人员接过卡片、打开系统、准备手动录入信息——姓名、手机号、卡号、有效期……不到十个字段&#x…

作者头像 李华
网站建设 2026/8/5 19:33:23

校园安全管理:学生出入登记表OCR识别留存电子档案

校园安全管理&#xff1a;学生出入登记表OCR识别留存电子档案 在一所普通中学的门卫室里&#xff0c;每天清晨和傍晚总能看到这样一幕&#xff1a;值班老师戴着老花镜&#xff0c;低头翻看一张张字迹各异的纸质《学生出入登记表》&#xff0c;然后手动将“张三、高三&#xff0…

作者头像 李华
网站建设 2026/8/9 5:59:33

盲人辅助阅读:手机拍摄书籍页面实时语音朗读OCR结果

盲人辅助阅读&#xff1a;手机拍摄书籍页面实时语音朗读OCR结果 在一间安静的图书馆里&#xff0c;一位视障学生举起手机&#xff0c;对准摊开的物理教材轻轻一拍。不到三秒后&#xff0c;耳机中传来清晰的人声&#xff1a;“麦克斯韦方程组描述了电场与磁场之间的关系……”没…

作者头像 李华
网站建设 2026/7/26 20:16:05

java计算机毕业设计学术团队资源管理系统 高校科研协作与资产一体化平台 基于SpringBoot的学术团队协同与资源共享系统

计算机毕业设计学术团队资源管理系统360369&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“双一流”建设背景下&#xff0c;科研资源的碎片化、信息孤岛化已成为制约高校学术…

作者头像 李华