第二章作业
找第 k 小的数,采用分治法(快速选择算法):
- 从数组中随机选一个元素作为基准值 pivot。
- 遍历数组,把小于 pivot 的放左边,大于 pivot 的放右边,等于的放中间(或统计小于 pivot 的个数)。
- 设小于 pivot 的元素个数为 cnt:
· 若 k == cnt + 1,则 pivot 就是第 k 小,直接返回。
· 若 k <= cnt,说明第 k 小在左半部分,递归处理左边。
· 若 k > cnt + 1,说明第 k 小在右半部分,递归处理右边,同时 k 减去 cnt + 1。 - 重复以上过程,直到找到目标。
二、时间复杂度
· 最好情况:每次划分都均匀分成两半,只需递归一边,规模减半。
T(n) = T(n/2) + O(n) → O(n)
· 最坏情况:每次选的 pivot 都是最大或最小元素,划分极不均匀,只能排除一个元素。
T(n) = T(n-1) + O(n) → O(n²)
三、对分治法的体会和思考
分治法的核心是“分而治之”:把大问题拆成规模更小的同类子问题,分别求解后再合并。找第 k 小的数让我体会到,分治不一定非要“两边都递归”——像快速选择这样,每次只递归有解的那一半,就能把平均复杂度降到线性。
同时我也认识到,分治法的效率高度依赖划分是否均衡。快速排序和快速选择最坏都会退化成 O(n²),所以才要引入随机化 pivot 来避免极端情况。这让我明白:分治法不仅要会“分”,更要设计好的划分策略,否则分治反而会变慢。
浙公网安备 33010602011771号