算法第二章作业

  1. 找第k小的数的分治算法
    (1)借用快排划分的思路。取一个基准数,通过交换把小于它的丢到左边,大于它的丢到右边,让基准数归位。
    (2)看基准数当前的排名。如果正好排在第k个,那它就是答案。如果排名大于k,说明目标在左边,递归去左半边找。如果排名小于k,说明目标在右边,去右半边找,注意这时候要把k减去左半边元素的个数。找完不用合并,直接返回结果就行。

  2. 分析该算法的最好时间复杂度和最坏时间复杂度
    (1)最好情况O(n):第一次选的基准数都刚好就是所求。第一轮遍历n个,也就是n的级别,不用全排序。
    (2)最坏情况O(n^2):如果数组已经有序,每次都拿第一个当基准,每次只能排除一个数。得递归n次,时间就退化成平方级了。实际写代码时可以通过随机选基准来避开这种极端情况。

  3. 对分治法的体会和思考
    分治法的核心是把大问题拆成小问题,这道题让我发现它不一定必须要合并。快排需要两边都排好,而找第k小只要判断目标在哪边,直接把另一边丢掉就行,这种只处理一半的思路效率很高。另外结合我之前调代码的教训,递归的时候k怎么传递、边界怎么设置一定要想清楚,不然很容易死循环或者越界。分治法写出来代码很干净,但递归深度太深的话也会占内存,实际用的时候需要权衡一下。

posted @ 2026-10-09 20:30  momo1号  阅读(8)  评论(0)    收藏  举报