
这段代码实现的是随机化三路快速排序,用来解决 LeetCode 912 题"排序数组"。
代码逻辑解析
- 主入口 :
sortArray调用递归排序方法,对整个数组范围[0, nums.length-1]进行排序。 - 随机选基准值 :
int key = nums[new Random().nextInt(r-l+1)+l];随机选取当前区间的一个元素作为基准值(pivot),这能有效避免在面对近似有序数组时退化为 O(n2) 的时间复杂度。 - 三路划分 :
left指针指向小于基准值的区域的末尾。right指针指向大于基准值的区域的开头。i为当前遍历指针。- 当
nums[i] < key时,与++left位置交换,并移动i。 - 当
nums[i] == key时,仅移动i。 - 当
nums[i] > key时,与--right位置交换(此时i不移动,因为换过来的元素还未处理)。
- 递归排序 :经过划分后,区间被分为
[l, left](小于key)、[left+1, right-1](等于key)、[right, r](大于key)。代码递归排序小于和大于基准值的两部分。 - 交换辅助函数 :
swap方法用于交换数组中的两个元素。
复杂度分析
- 时间复杂度 :由于使用了随机选基准值,期望时间复杂度为 O(nlogn),满足题目不使用内置函数且达到 O(nlogn) 的要求。
- 空间复杂度 :递归调用栈的深度期望为 O(logn),原地交换元素,额外空间复杂度为 O(logn)。