算法第二章上机实践报告
1.实践题目名称:找第k小的数;
2.问题描述:在n个无序的整数中找到第k小的数(1<=n<=1000),要求用平均时间为O(n)的算法;
3.算法描述:
(1)int partition(int a[], int left, int right)

功能:根据数组中间的某个元素x对数组进行划分,划分后的x所在位置的左侧全小于等于x,右侧全部大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。
(2)int find(int a[],int left,int right,int k)

功能:调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左半部分或右半部分查找。
(3)int main()

功能:输入数据,调用int partition函数、int find函数,输出结果。
4.算法时间及空间复杂度分析:
本题采用分治方法,先任意找数组中的一个元素x,采用快速排序将数组进行一次划分,即将小于x的元素放在其左侧,大于x的元素放在其右侧。然后判断元素x是否满足题目为第k小的数,满足则直接输出,否则判断下一次在哪一区间进行划分,时间复杂度为O(n);find函数中用到递归,空间复杂度O(log n)。
5.心得体会:
进一步理解了递归和分治法,学会了用partition函数对数组进行划分。

浙公网安备 33010602011771号