第二章作业|第K小数

1.第K小数算法描述
找到第K小的数最直接的方法就是直接排好序去找,用上最快的排序方法时间复杂度位O(nlogn)
我们发现可以利用快速排序的思路,因为我们不需要全部排好序,只需要让下标为k-1的那个位置上的数是正确的,它左边所有数都≤它,右边所有数都≥它,最后返回它。快速排序就是先排好一个数的位置,再去递归排两边。
描述:
做完 partition [这个函数是把pivot的正确位置返回]后,得到 pivot 的位置m
对比m和目标下标k-1
如果 m == k-1:pivot 就是第 k 小的数,直接返回,结束
如果 m > k-1:说明第 k 小在左半区,右半区直接丢弃,只递归处理左半区
如果 m < k-1:说明第 k 小在右半区,左半区直接丢弃,只递归处理右半区

2.最坏复杂度:
快速选择的时间消耗,全部来自每一轮的partition操作:每一轮 partition 都需要完整遍历当前区间的所有元素,时间代价等于当前区间的长度。当pivot选取糟糕,每次都是选择了当前区间的极值,导致每次问题规模只是减少1,n+(n-1)+......+1=n(n+1)/2
最欢复杂度为O(n^2)

最好的复杂度分析:每次刚好选择区间的中间值,为O(n)

3.对分治法的思考
分治思想就是把一个问题分解成若干个子问题,然后分别解决这些子问题,最后合并子问题的解得到原问题的解,这种思想广泛存在于递归算法中。可以理解为分解问题

posted @ 2026-10-13 21:39  Zero09  阅读(1)  评论(0)    收藏  举报