算法第二章上机实践报告

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

2、问题描述:设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。

3、算法描述:

(1)int partition(int a[],int p,int r)

用函数partition来根据给定下标为p的元素大小对a[p]到a[r]进行划分,从a[p]往右找起直到找到一个数组元素比a[p]大,然后从a[r]往左找起直到找到一个数组元素比a[p]小,然后判断这两个元素的下标i和j,i是否小于j,若是,则将这两个元素交换,并重复以上的步骤继续找,若不是,则已经将整个数组划分完成,最后将a[p](基数)和此时的a[j]交换,跳出循环划分完成。并返回此时的j下标。

(2)int find(int a[],int left,int right,int k)

这个函数调用partition函数来得到以某个元素为基准划分好的此时这个元素的下标(例如赋值给m),因为我们要求找到第k小的数,由于下标从0开始,因此满足m+1==k,即可找到第k小哥数就是a[m]。

(3)int main()

主函数包括了元素的输入,存储,调用find函数,输出

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

时间复杂度:运用了分治法和快速排序法。用数组中的元素x对数组进行划分,分成左右两个区域,判断x是否为第k小的数,若是,则输出,若不是继续划分查找,平均时间复杂度则为O(n)

空间复杂度:find函数运用了递归,空间复杂度为O(logn)。

5、对分治法有了更加深刻的理解,如何分解子问题,求解子问题,合并子问题。对快速排序这种算法更加清晰理解。

posted @ 2020-10-03 10:46  张智恒  阅读(98)  评论(0编辑  收藏  举报