第二章作业
1、自然语言描述:
(1)选取数组中的一个元素作为基准pivot,对数组划分:小于等于 pivot 放左边,大于等于 pivot 放右边,得到基准所在位置。
(2)计算左分区(含基准)的元素个数left_len:
- 如果k == left_len:基准就是第 k 小元素,直接返回;
- 如果k < left_len:说明第 k 小在左分区,递归在左区间查找第 k 小;
- 如果k > left_len:说明第 k 小在右分区,递归在右区间查找第k-left_len小。
(3)递归终止条件:区间内只有一个元素,该元素就是第 k 小。
2、时间复杂度: - 最好情况:每次划分的基准都刚好把数组均匀分成两半。每次递归只处理一半数组,总元素操作量:n+n/2+n/4+...=O(n)
最好时间复杂度:(O(n) - 最坏情况:每次选的基准都是当前区间最大 / 最小值,划分后一侧只有 1 个元素,另一侧是剩下全部元素(数组已经有序,每次选端点做 pivot)。递归需要遍历 (n+(n-1)+(n-2)+\dots = O(n^2))
最坏时间复杂度:(O(n^2)
补充:如果使用**随机基准的快速选择,期望平均时间复杂度为O(n)。
3、对分治法的体会和思考:
分治法核心思路是分、治、合:把一个大规模的复杂原问题,拆成若干规模更小、结构相同的子问题;递归求解子问题;最后合并子问题的解,得到原问题答案。
- 分:拆分问题,降低规模。像找第 k 小,不需要对整个数组全排序,划分后只需要继续处理包含目标的那一个子问题,另一个子问题直接丢弃,减少大量计算。
- 治:递归求解子问题,直到子问题足够简单,可以直接得出解(基线条件)。
- 合:很多分治问题需要合并子问题结果(如归并排序);而快速选择这类算法,不需要合并,因为我们只关心目标在哪一侧,不需要两边都算出结果。

浙公网安备 33010602011771号