算法第二章上机实践报告

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函数对数组进行划分。

 

posted @ 2020-10-03 20:50  DetectiveFang  阅读(144)  评论(0)    收藏  举报