算法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)
相关推荐
野生技术架构师1 小时前
1200 道 JAVA 面试题(各大企业常见面试题及答案)
java·开发语言
careathers1 小时前
【数据结构】栈
java·数据结构
远航计算机1 小时前
GEO 选题从哪来?用一份 Query 词库把一年内容排出来
大数据·人工智能·算法·aigc
宣宣猪的小花园.1 小时前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习
邪修king1 小时前
Re:Linux系统篇(二十六):文件系统(二):Ext 文件系统底层详解:从 inode、块组到软硬链接,结合 Windows 讲透文件管理本质
android·java·linux
mmmmath_31 小时前
LeetCode.018.四数之和
数据结构·算法·leetcode
AIGCmagic社区1 小时前
腾讯混元 AuK 技术报告拆读:1.5B 统一语音生成与编辑,蒸馏后 4 步无 CFG 提速 4.5 倍
人工智能·算法·aigc·ai多模态
大熊背1 小时前
基于照明色度表征的颜色恒常性的白平衡算法实现
算法·白平衡·色温·色度坐标·普朗克曲线
Yyyyyy~1 小时前
【java】类和对象
java·开发语言