算法第二章上机实践报告

1、实践题目名称:PTA2-1 找第k小的数

2、问题描述:

 

 

 3、算法描述:

(1)主函数:数组从下标1开始存储n个数字,先通过find函数找到第k小的数是下标再输出它的值。

 

 

 (2)find函数:通过调用partition函数获得枢纽mid,判断mid是否第k小的下标,若是则直接返回下标;若不是,递归调用find函数继续在左段或右段查找。

(3)partition函数:将数组中比枢纽值a[0]小的数都排在原数组的左半部分,比枢纽值a[0]大的数都排在原数组的右半部分。

(为了避免“第k个”和“k-1小标”混淆,修改了课本里的partition函数,将a[0]作为枢纽来进行比较、交换左右,注意先右后左,顺序不能变动)

 

 

4、算法时间及空间复杂度分析:

(1)时间:
最坏情况下,每次取得的枢纽为边界值(最小值或最大值),即划分区域包含n-1和1个元素时,由于partition计算时间为O(n),n>1时,T(n) = T(n-1) + O(n) = O(n^2);
最好情况下,每次取得的枢纽为恰好mid,左右两边均为为n/2;由n>1,T(n) = 2T(n/2) + O(n) = O(nlogn)。
(2)空间:
最好情况下空间复杂度为O(logn),最坏情况下需递归 n-1 次,空间复杂度为O(n)。

5、心得体会:对递归和分治有了更深的理解,能够按个人需要修改partition函数(虽然也太大必要但过了就很开心),不过对时间、空间复杂度的分析还有待提高。

posted @ 2020-10-03 17:33  杨璇  阅读(131)  评论(0编辑  收藏  举报