算法第二章上机实践报告
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、对分治法有了更加深刻的理解,如何分解子问题,求解子问题,合并子问题。对快速排序这种算法更加清晰理解。