算法第二章实践作业

第一题:
给定数组 A 和整数 k,先从数组中随机选一个元素作为分界线,把其余元素与它比较并划分,使不大于分界线的元素在左边、大于分界线的元素在右边,此时分界线的排名为 rank(即左边元素个数加 1)。然后将 k 与 rank 比较:若 k 等于 rank,分界线就是第 k 小的数,直接返回;若 k 小于 rank,说明答案在左半部分,只在左半部分中继续查找第 k 小的数;若 k 大于 rank,说明答案在右半部分,只在右半部分中继续查找第 (k − rank) 小的数。如此不断缩小范围,直到区间只剩一个元素,该元素即为所求。

第二题:
最好情况:O(n)
第一次划分时枢轴恰好就是第 k 小的数,只需扫描一遍数组,代价为 n,直接返回。即使每次划分都很均衡,递推式为 T(n) = T(n/2) + O(n),解得 O(n)。

最坏情况:O(n²)
每次选到的枢轴都是当前区间的最小值或最大值(例如数组已有序而总选第一个元素作枢轴),每次只能排除一个元素:T(n) = T(n−1) + O(n) = O(n²)
第三题:
体会思考:分治法的主要思想就是将复杂的问题拆分为多个子问题,然后再进行合并,这样更方便求解。但有时候也要注意子问题重复计算的问题,在某些情况下记得优化一下,降低时间复杂度。多数分治算法需要求解多个子问题并合并结果,但比如第一题的快速选择是分治的特例:划分之后只需要递归求解其中一个子区间,舍弃另一半,不需要合并子问题结果,减少了计算量。

posted @ 2026-10-13 23:21  benshaw  阅读(3)  评论(0)    收藏  举报