算法第二章上机实践报告

1.实践题目名称:

找第k小的数

2.问题描述:

输入n和k(0<k<=n<=10000)及n个整数,设计一个平均时间为O(n)的算法,在n个无序的整数中找出第k小的数。

3.算法描述:

利用find函数调用partition函数找到划分元素x,然后判断x是不是第k小的数,不是就判断当前的划分点是大于还是小于k,若大于k就递归在左端,小于k则在右端查找。

其中partition的作用是将输入的n个数中比元素x小的排在其左边,比元素x大的排在其右边。

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

我的做法利用了快排和分治法。首先在数组中找一个元素x,采用快速排序将数组进行一次划分,将小于x的元素放在x左侧,大于x的元素放在x右侧,之后判断元素x是否为第k小的数,满足则直接输出,否则判断下一次在哪一区间进行划分,时间复杂度为O(n)。在find函数中用到了递归调用,空间复杂度为O(logn)。

5.心得体会:

最初我想着用快速排序法将输入的元素排序完再输出第k个数,但是发现运行超时,后来仔细审题才发现题目暗示我用find函数对快速排序进行递归调用。经过这次实战,我对分治法又有了更加深刻的印象。

posted @ 2020-10-03 22:37  _Marco  阅读(84)  评论(0编辑  收藏  举报