找第k小数的分治算法描述
自然语言描述:
在数组中随机选一个数作为基准,把数组分成三部分:比基准小的、等于基准的、比基准大的,计算每部分有多少个数

判断:
如果k在"小"的部分,就在那部分继续找第k小的数
如果k在"等"的部分,基准就是答案
如果k在"大"的部分,就在那部分找第(k-小部分-等部分)小的数

伪代码:
text
function findKthSmallest(arr, k):
pivot = 随机选择arr中的一个元素
small = [x for x in arr if x < pivot]
equal = [x for x in arr if x == pivot]
large = [x for x in arr if x > pivot]

if k <= len(small):
    return findKthSmallest(small, k)
else if k <= len(small) + len(equal):
    return pivot
else:
    return findKthSmallest(large, k - len(small) - len(equal))

时间复杂度分析
最好情况:O(n)
每次都能扔掉一半数据
如:T(n) = T(n/2) + n → O(n)

最坏情况:O(n²)
每次只能减少一个元素
如:T(n) = T(n-1) + n → O(n²)

对分治法的体会
核心思想:大事化小,小事化了

优点:
1、复杂问题变简单
2、代码容易理解和实现
3、有时能大幅提高效率

难点:
1、要找到合适的分割点
2、递归边界容易出错
3、合并结果需要技巧

感悟:分治法像"团队协作"——把大任务拆成小任务分给不同人,最后汇总结果。这种"分而治之"的思想在编程和生活中都很实用。

posted on 2025-10-28 21:03  陈祉夷  阅读(12)  评论(0)    收藏  举报