第二次作业

1、首先得选一个 “基准数”(贪方便的话就选第一个),然后把数组分成两部分:比基准数小的数放左边,比基准数大的放右边,基准数自己则在中间 “落位”。接下来就看我们要找的 k,和基准数的排名(m+1)比谁大:如果 k 正好等于 m+1,那基准数就是我们要找的第 k 小数,直接返回就行;如果 k 比 m+1 小,说明第 k 小数在左边那堆比基准数小的数里,接下来只需要在左半边数组里重复刚才的操作(再选基准、分区、判断排名);如果 k 比 m+1 大,说明第 k 小数在右边那堆比基准数大的数里,不过这时候要找的就不是 “第 k 小” 了,而是右半边数组里的 “第 k-(m+1) 小”(因为左边和基准数已经占了 m+1 个比它小的数),再对右半边重复分区和判断的步骤。就这么一轮一轮缩小范围,每次都把查找的数组砍成一半左右(理想情况),直到某次分区后,基准数的排名正好等于我们要找的 k,或者查找范围缩小到只有一个数(那这个数就是第 k 小),算法就结束了。

2、最好时间复杂度O(n):每次选择的基准数恰好能将数组 “均匀划分”(即基准数的排名接近当前查找范围的中间位置)。
最坏时间复杂度O(n):每次选择的基准数都是当前查找范围中的 “最值”(如最小数或最大数),导致划分极端不平衡。

3、结合分治法的学习,我最大的体会是它不仅是一种算法思想,更是一种 “拆解复杂问题” 的思维方式 —— 核心是把 “大麻烦” 拆成多个 “小麻烦”,解决小麻烦后再整合结果,最终化解大问题。这种思路既降低了问题的复杂度,也让解决过程更有条理。分治法的本质是遵循 “分解- 解决- 合并” 的三步闭环,每一步都在针对性解决问题的 “难” 点

posted @ 2025-10-31 21:28  黄小冬  阅读(4)  评论(0)    收藏  举报