第二次作业

一、算法描述

  1. 核心逻辑
    借鉴快速排序的分治思想,不用全排序,每次选一个基准元素,把数组分成“比基准小”和“比基准大”两部分,再看基准位置和k的关系——如果基准是第k个位置,它就是答案;如果k在左半区,就递归找左半区的第k小;如果在右半区,就找右半区的第(k-左半区元素数)小,直到找到。

二、时间复杂度
最好时间复杂度**:O(n)
每次划分都特别均衡(基准是当前区间中位数),每次遍历的元素数从n降到n/2、n/4…直到1,总时间是n + n/2 + n/4 + … + 1 ≈ 2n,所以是O(n)。

最坏时间复杂度**:O(n²)
每次划分都极不均衡(基准是当前区间最大/最小值,比如数组已排序,选最后一个当基准),每次遍历的元素数从n降到n-1、n-2…直到1,总时间是n + (n-1) + … + 1 = n(n+1)/2,所以是O(n²)。

三、对分治法的体会

  1. 分治的核心是“拆大问题为小问题”,小问题和原问题结构一样、互不干扰,解决小问题后要么直接用结果(比如快速选择),要么合并结果(比如归并排序),逻辑比直接解决大问题简单。
  2. 分治的效率很看“拆分均衡性”,拆分越均衡,子问题规模降得越快,效率越高;反之容易出现最坏情况。另外还要考虑合并成本——归并排序因为要合并子数组,总时间是O(n log n),而快速选择不用合并,最好能到O(n)。
  3. 分治不是万能的,只适合“能拆分、子问题独立”的场景(比如排序、查找),如果问题拆不开或子问题互相依赖,用分治反而麻烦。
posted @ 2025-10-19 14:14  谢靖雯  阅读(4)  评论(0)    收藏  举报