算法第二章作业

一. 自然语言描述
算法遵循分治法「分解→解决→合并」的核心框架,具体步骤如下:
1.分解:在当前数组区间中选取一个基准元素(pivot),通过分区操作将数组划分为两部分:左侧所有元素 ≤ 基准,右侧所有元素 ≥ 基准,最终得到基准元素在整个数组中的确定位置 pivot_idx。
2.解决:根据基准位置与目标 k 的相对关系,只向一个子问题递归:
若pivot_idx == k-1(k 从 1 开始计数):基准元素就是第 k 小的数,直接返回结果。
若pivot_idx > k-1:第 k 小数落在左半分区,递归对左半区间执行快速选择。
若pivot_idx < k-1:第 k 小数落在右半分区,递归对右半区间执行快速选择,同时将 k 调整为 k - (pivot_idx + 1)。
3.合并:由于目标元素仅存在于一个子分区中,子问题的解就是原问题的解,无需额外合并操作。

二、时间复杂度分析

  1. 最好时间复杂度:O(n)

触发场景:每次选择的基准恰好是当前区间的中位数,分区后左右子区间长度完全相等或接近相等。
推导过程:每次递归仅需处理一半规模的子问题,各层分区操作的总计算量为等比数列求和
求和结果与 n 呈线性关系,因此最好时间复杂度为O(n)。

  1. 最坏时间复杂度:O(n^2)

触发场景:每次选择的基准都是当前区间的最大值或最小值,导致分区极不均衡 —— 一个子区间为空,另一个子区间仅比原区间少 1 个元素。
推导过程:每次递归仅将问题规模减少 1,总计算量为等差数列求和
求和结果与 n 的平方成正比,因此最坏时间复杂度为O(n^2)。

三、对分治法的体会与思考

  1. 分治不是机械拆分,而是减而治之的智慧

分治法的通用框架是分解为子问题→分别求解→合并结果,但快速选择最巧妙的地方在于它跳出了必须处理所有子问题的定式 —— 利用第 k 小元素的位置唯一性,只递归目标所在的单侧区间,完全舍弃另一侧的计算。
这说明分治的核心是缩小问题规模,而非拆分所有分支。对比快速排序需要处理双侧分区O(n\log n),快速选择通过裁剪冗余子问题将平均复杂度降到了线性,这是分治思想结合问题特性的典型优化。

  1. 分解的均衡性是分治效率的核心

归并排序的分解是稳定的二分,因此时间复杂度稳定在 O(n\log n);
快速排序、快速选择的分解依赖基准选择,因此复杂度存在理论上的最坏情况。
这启发我们:设计分治算法时,让子问题规模尽可能均衡,才能充分发挥分治降低复杂度的优势。

posted @ 2026-10-13 19:17  lelezoo  阅读(2)  评论(0)    收藏  举报