算法第二章实践作业

1.用自然语言描述找第k小的数的分治算法:
从一堆数里随便挑一个数当“基准”。然后把所有数分成三堆:比基准小的、和基准一样大的、比基准大的。数一数“比基准小”的那堆有几个数,
如果k不超过这堆的个数,说明第k小的数就在“小的那堆”里,那就只去那堆继续找第k小。
如果k比这堆多,但没超过“小的个数 + 和基准相等的个数”,说明基准本身就是第k小,直接返回它。
否则,第k小就在“大的那堆”里,并且要找的目标变成:在“大的那堆”里找第“k减去小的个数再减去相等个数”小的数。
就这样每次只处理一边,直到找到为止。
2.分析该算法的最好时间复杂度和最坏时间复杂度:
最好情况:O(n)。每次分得比较均匀,或者很快找到,只需要处理一部分。
最坏情况:O(n²)。每次基准都选到最大或最小,只能排除一个数。
3.对分治法的体会和思考:
分治法就是把大问题拆成小问题,小问题用同样套路解决,可以简化问题。
关键在“怎么分”,分得均衡就快,分得偏就慢。
分治法通常用递归实现,所以会导致运行时间相较于其他算法更久一点。

posted @ 2026-10-13 20:06  郑海滨  阅读(3)  评论(0)    收藏  举报