mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-01 11:43:46 +00:00
Update Leetcode 题解 - 排序.md
补充快速选择在随机输入下的平均比较次数。
This commit is contained in:
@@ -65,7 +65,7 @@ public int findKthLargest(int[] nums, int k) {
|
||||
|
||||
快速选择:平均时间复杂度 O(N),空间复杂度 O(1)。
|
||||
|
||||
第 k 大的元素就是升序排序后下标为 N - k 的元素。partition() 与快速排序的[切分](算法%20-%20排序.md#2-切分)相同,返回切分元素的最终位置 j,它左边的元素都不大于它,右边的都不小于它。j 等于目标下标时直接得到答案;j 小于目标下标时只需要在右半边继续切分,否则在左半边,每次只处理一边,平均下来总的比较次数是 N + N / 2 + N / 4 + ... ≈ 2N。
|
||||
第 k 大的元素就是升序排序后下标为 N - k 的元素。partition() 与快速排序的[切分](算法%20-%20排序.md#2-切分)相同,返回切分元素的最终位置 j,它左边的元素都不大于它,右边的都不小于它。j 等于目标下标时直接得到答案;j 小于目标下标时只需要在右半边继续切分,否则在左半边,每次只处理一边。每次恰好对半分时比较次数为 N + N / 2 + N / 4 + ... ≈ 2N;随机输入下找中位数平均约 3.4N,仍是线性的。
|
||||
|
||||
以 [3, 2, 1, 5, 6, 4]、k = 2 为例(为便于对照没有打乱),两轮切分就找到了答案:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user