Update Leetcode 题解 - 排序.md

补充快速选择在随机输入下的平均比较次数。
This commit is contained in:
CyC2018
2026-10-31 00:23:18 +08:00
parent 6407ce2f94
commit 376e324a27
+1 -1
View File
@@ -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 为例(为便于对照没有打乱),两轮切分就找到了答案: