算法第二章实践作业

题目是:找出数组中第K小的数。

这题用到的基础算法是快速排序,但与快速排序里“整个数组都排好序”不同,题中运用“快速排序的简化版”,不需要把整个数组排好序,而是通过 “分区” 分块排序,逐步缩小范围,直接定位到第 k 小的元素。

有两个主要函数,下面是作用描述。
1、分区(partition 函数)
随便从数组里挑一个数当 “基准”,然后把数组分成两部分:(小数 基准 大数),最后确定这个基准在数组里的位置。

2、缩小范围(find 函数)
拿到基准的位置后,算算基准位置 m 对于 k 的位置。
如果 k 正好等于 m,说明这个基准就是第 k 小的数,
如果 k 比 m 小,说明第 k 小的数在基准左边,就去左边的子数组里找第 k 小的数,
如果 k 比 m 大,说明第 k 小的数在基准右边,就去右边的子数组里找第(k - m)小的数。

3、重复这个过程,每次都能把查找范围缩小一半左右,直到找到目标。

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

学完分治法之后,我最大的感觉是 “这算法好牛”“原来复杂问题能这么拆着解决啊”,理解这个算法的难度不大,但是能想出这样算法的难度可不小。
总结核心逻辑:把看着复杂的问题,拆成好几个小的、跟原问题差不多的子问题。 “先拆、再解、最后拼起来”,拆的时候把大问题变小,小问题解决了,大问题的答案自然就出来了。分治法给我的感觉是 “化繁为简” 的思路,是一种 “解决问题的习惯”。但要用好也不容易,得琢磨怎么拆才合理,什么时候该用什么时候不该用。

posted @ 2025-11-02 22:48  GFLMD  阅读(4)  评论(0)    收藏  举报