算法47,分治快排,第K大

1. 代码逻辑解析

  • 随机选基准值nums[new Random().nextInt(r-l+1)+l] 随机选取基准值 key,避免有序数组下的最坏情况。
  • 三路分区 :将当前区间 [l, r] 划分为三部分:小于 key、等于 key、大于 key
    • left 指向大于 key 区域的末尾,right 指向小于 key 区域的开头。
    • 遍历数组,将元素交换到对应区域。
  • 分类讨论
    • b 为大于 key 的元素个数,c 为等于 key 的元素个数。
    • c >= k(第 k 大元素在等于 key 的区域),直接返回 key
    • b >= k(第 k 大元素在大于 key 的区域),递归左半部分(大于 key 的区域)。
    • 否则(第 k 大元素在小于 key 的区域),递归右半部分,并更新 k = k - b - c

2. 复杂度分析

  • 时间复杂度 :平均 O(n),最坏情况(每次分区极不均匀)为 O(n²)。随机化基准值可有效避免最坏情况。
  • 空间复杂度O(log n)(递归栈深度,随机化下平均对数级)。

3. 优缺点评价

  • 优点:利用了三路快排处理重复元素的优势,逻辑严谨,效率较高。
  • 缺点
    • 每次递归都 new Random(),有一定性能开销。
    • 分区逻辑变量较多(如 left-1right+1),容易在边界条件上出错。

4. 优化与替代方案

  • 优化建议
    • Random 实例提取为全局静态变量,避免频繁创建。
    • 当区间较小时(如长度 < 10),可切换为插入排序以提升缓存命中率。
  • 替代方案
    • 最小堆 :维护一个大小为 k 的最小堆,时间复杂度 O(n log k),空间复杂度 O(k),适合处理海量数据。
    • 快速选择(双路分区):常规的双指针分区同样可以实现 O(n) 的平均时间复杂度。

5. 注意事项

  • 题目明确"第 k 个最大元素"允许重复(如示例 2),三路快排恰好适合此场景。
  • 递归终止条件 if(l==r) return nums[l]; 确保了区间缩小到单个元素时正确返回。
相关推荐
程序猫.1 小时前
算法刷题笔记:模拟题从入门到实战(含 LeetCode 例题与习题)
java·数据结构·算法
Wang's Blog1 小时前
Java 服务器: Linux-MySQL的rpm安装与初始化配置
java·服务器
IT枫斗者枫哥1 小时前
Spring Boot Excel 导入实战:把“导入失败”改成逐行错误报告
java·spring boot
殷紫川1 小时前
Java 27 九大核心特性解析与实战
java
用户094248568031 小时前
第11章:OpenJDK反射、动态代理与 MethodHandle 初探
java·jvm
小蒜学长1 小时前
基于SpringBoot+Vue的游戏论坛系统的设计与实现(代码+数据库+LW)
java·后端·springboot·游戏论坛系统·社区生态
SimonKing1 小时前
文档杂乱怎么查找:用 Papra 搭一个极简文档管理系统
java·后端·程序员
captain3761 小时前
网络原理(7)-NAT(Network Address Translation)
java·网络·网络协议·java-ee
jaysee-sjc1 小时前
【苍穹外卖】Day01:从零认识企业级项目开发
java·开发语言·数据库·mysql·spring·intellij-idea·mybatis