算法第二章作业

1.用伪代码描述找第k小的数的分治算法
function selectKthSmallest(arr, k):
if arr 为空:
return 错误
pivot = 从 arr 中随机选择一个元素
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]

if k <= len(left):
    return selectKthSmallest(left, k)
else if k <= len(left) + len(middle):
    return pivot
else:
    return selectKthSmallest(right, k - len(left) - len(middle))
  1. 时间复杂度分析
    最好情况时间复杂度
    场景:每次选择的基准都能将数组均匀划分(即 left、middle、right 的大小大致相等)。
    时间复杂度:每次递归处理原问题规模的一半,递归深度为 O(log n),每层处理时间为 O(n)。因此,最好情况时间复杂度为 O(n)。

最坏情况时间复杂度
场景:每次选择的基准都是当前数组中的最小或最大元素,导致每次只能减少一个元素。
时间复杂度:递归深度为 O(n),每层处理时间为 O(n)。因此,最坏情况时间复杂度为 O(n²)。

3.分治法的体会和思考
分治法将复杂问题分解为规模更小的子问题,使问题的解决变得清晰而优雅。递归是实现分治法的自然方式,它让代码更加简洁易懂。
分治法不仅是一种算法技术,更是一种解决问题的通用思想。在现实生活中,我们也可以运用分治法将复杂任务拆解为若干个小任务,逐个击破。

posted @ 2025-11-02 16:32  ?|?|?  阅读(4)  评论(0)    收藏  举报