算法46,分治快排,排序数组

这段代码实现的是随机化三路快速排序,用来解决 LeetCode 912 题"排序数组"。

代码逻辑解析

  1. 主入口 :sortArray 调用递归排序方法,对整个数组范围 [0, nums.length-1] 进行排序。
  2. 随机选基准值 :int key = nums[new Random().nextInt(r-l+1)+l]; 随机选取当前区间的一个元素作为基准值(pivot),这能有效避免在面对近似有序数组时退化为 O(n2) 的时间复杂度。
  3. 三路划分 :
    • left 指针指向小于基准值的区域的末尾。
    • right 指针指向大于基准值的区域的开头。
    • i 为当前遍历指针。
    • 当 nums[i] < key 时,与 ++left 位置交换,并移动 i。
    • 当 nums[i] == key 时,仅移动 i。
    • 当 nums[i] > key 时,与 --right 位置交换(此时 i 不移动,因为换过来的元素还未处理)。
  4. 递归排序 :经过划分后,区间被分为 [l, left](小于key)、[left+1, right-1](等于key)、[right, r](大于key)。代码递归排序小于和大于基准值的两部分。
  5. 交换辅助函数 :swap 方法用于交换数组中的两个元素。

复杂度分析

  • 时间复杂度 :由于使用了随机选基准值,期望时间复杂度为 O(nlogn),满足题目不使用内置函数且达到 O(nlogn) 的要求。
  • 空间复杂度 :递归调用栈的深度期望为 O(logn),原地交换元素,额外空间复杂度为 O(logn)。
相关推荐
sinat_286945191 分钟前
大模型推理:部署方式与性能优化思路
人工智能·算法·缓存·chatgpt·性能优化
longlongzihan2 分钟前
LeetCode 283. 移动零:从辅助数组到双指针原地算法
c++·算法·leetcode
在所不辞兄3 分钟前
【零基础学智能仿真-42】二维随机有限元实战——把随机材料场赋给网格单元
人工智能·深度学习·算法·机器学习·工程仿真
罗湖老棍子4 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
panxianren7 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
sunshine22 girl9 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
奋发向前wcx9 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
省钱兄--zs9 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang10 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl10 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习