算法第二章

自然语言描述(基于快速选择算法 QuickSelect):
1.选择基准:在数组 A 中随机选择一个元素作为基准。
2. 划分:根据基准元素对数组进行重新排列,使得小于基准的元素都放在基准的左边,大于基准的元素都放在基准的右边。此时基准元素所在的位置 p 就是它在整个数组排序后的正确下标。
3. 判断与递归:
如果 k == p:说明基准元素恰好就是第 k 小的数,直接返回 A[p]。
如果 k < p:说明第 k 小的数在基准的左边,递归地在左半部分寻找第 k 小的数。
如果 k > p:说明第 k 小的数在基准的右边,递归地在右半部分寻找第 k - p 小的数(因为左边已经有 p 个数比它小了)。

分析该算法的最好时间复杂度和最坏时间复杂度
1.最好时间复杂度:O(n)
分析:当每次选择的基准元素恰好是整个区间的“中位数”时,每次划分都能将数组均匀地分为左右两个部分,搜索范围缩小一半。
递推公式:T(n) = T(n/2) + O(n)。第一层划分需要遍历n个元素,第二层遍历 n/2,第三层 n/4,累加和趋近于 2n,因此复杂度为 O(n)。
2.最坏时间复杂度:O(n²)
分析:当每次选择的基准元素都是当前区间的最小值或最大值时(例如数组已经是正序或逆序排列,且每次固定选择第一个元素作为基准),划分极度不平衡。
递推公式:T(n) = T(n-1) + O(n)。每次只能排除一个元素,递归深度变为 n,累加开销为 n + (n-1) + ... + 1 = O(n²)。

结合本章学习,对分治法的体会如下:

  1. 核心思想:化大为小,各个击破。
  2. 关键要点:划分需均衡。如找第k小数时,基准选不好会退化为O(n²)。
  3. 灵活变通:找第k小数只需递归单侧(减治),无需合并,效率更高。
  4. 利弊权衡:递归代码简洁优雅,但存在栈空间开销,需防溢出。
posted @ 2026-10-13 23:53  .7even  阅读(2)  评论(0)    收藏  举报