算法第二章实践作业

1. 用自然语言或伪代码描述找第 k 小的数的分治算法

算法思想:

采用快速选择算法,先选择一个基准值,将数组划分为左右两部分,再根据基准值的位置判断第 k 小的数在哪一部分,只对目标所在的部分继续递归查找,直到找到结果。

伪代码:

QuickSelect(A, left, right, k)
    if left == right
        return A[left]

    p = Partition(A, left, right)
    m = p - left + 1

    if k == m
        return A[p]
    else if k < m
        return QuickSelect(A, left, p-1, k)
    else
        return QuickSelect(A, p+1, right, k-m)

其中,Partition 用于划分数组并返回基准值的最终位置,k 从 1 开始计数。

2. 分析算法的最好和最坏时间复杂度

(1)最好情况:

每次划分都比较均匀,只需要处理规模约为原来一半的子问题。

\[ T(n)=T(n/2)+O(n) \]

因此,最好时间复杂度为 O(n)。

(2)最坏情况:

每次选择的基准值都是最大值或最小值,每次只能减少一个元素。

\[ T(n)=T(n-1)+O(n) \]

因此,最坏时间复杂度为 O(n²)。

该算法的平均时间复杂度为 O(n),通常比先排序再查找更高效。

3. 结合本章学习,谈谈对分治法的体会和思考

通过本章学习,我理解了分治法的核心思想,就是将一个大问题分解成若干个小问题,再逐步解决。例如归并排序、快速排序和查找第 k 小的数,都体现了这种思想。

其中,找第 k 小的数让我认识到,并不是所有问题都需要完整处理,有时只需要解决其中一部分,就能得到结果,从而减少计算量。

同时,分治法的效率也与划分方式有关,不合理的划分可能导致时间复杂度增加。因此,在使用分治法时,不仅要考虑如何分解问题,还要注意算法的效率。

通过学习,我体会到分治法不仅是一种算法,也是分析和解决复杂问题的重要思路。

posted @ 2026-10-13 22:35  冯锦涛  阅读(2)  评论(0)    收藏  举报