算法第二章实践作业

(1)请用自然语言或伪代码描述找第k小的数的分治算法
前置:定义一个无序数组a[1…n],其中1<=k<=n;

  1. 在当前区间l到r选一个基准元素x;
  2. 对区间划分:把<x的元素放左边,>x的元素放右边,通过partition()函数实现,实现分治两侧;
  3. 算出此时x在当前区间中升序的排名为m,确定为该数组的第m小;
  4. if k == m: 即为答案;
  5. if k < m: 说明第k小的在x左边,递归在左区间找第k小;
  6. if k > m: 说明第k小的在x右边,递归在右区间找第k-m小;
  7. l == r为递归出口
    (2)分析该算法的最好时间复杂度和最坏时间复杂度
    最好情况:每次选择的基准都接近该数组中位数位置。通过分治可列出表达式T(n)=T(n/2)+O(n);有主定理得T(n)=O(n)
    最坏情况:每次基准都是该数组最大或最小值,T(n)=T(n-1)+O(n), T(n)=O(n2)
    (3)结合本章的学习,谈谈你对分治法的体会和思考
    1.划分的标准、如何分解子问题和如何合并决定算法的效率,就像上面的分治中的快速选择,算法效率取决于选取的基准元素;
    2.分治法有三步但不一定要合并,有些问题可以直接就输出答案省略合并的步骤;
    3.分治法的本质相当于递归,都有把问题的规模缩小的思想来解决,可以用在规模大不好直接解决但子问题方便解决的问题上。它适用的前提是:子问题与原问题同构、相互独立、规模可缩小、解可合并。
posted @ 2026-10-13 20:29  星火燎原191  阅读(4)  评论(0)    收藏  举报