第二章上机实验报告

1.实践问题:

    寻找第k小的数

2.问题描述:

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

    提示:函数int partition(int a[],int left,int right)的功能是根据a[left]~a[right]中的某个元素x(如a[left])对a[left]~a[right]进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。因此可以编制int find(int a[],int left,int right,int k)函数,通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。

3.算法描述:

    利用快速排序的方法,对这组无序的数据进行排序。在partition函数中,以某个数据x为准进行划分,设置两个计数器i和j,将大于x和小于x的数据通过swap交换,最终得到x所在位置前全是小于x的数据且x所在位置后全为大于x的数据。在快速排序的过程中,x所在的确定的位置便为这组数据的第几小。

若需要找的第几小小于x的位置,便继续从(a,left,mid-1)中继续找;若所找大于x的位置,便从(a,mid+1,right)中继续找,直至找到最终的结果。

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

    时间复杂度:O(nlogn)每次都划分成两个序列;

            当n <= 1时,T(n)= O(1); 当n > 1时,T(n)= 2T(n / 2)+ O(n);

            由T(n)= aT(n/b)+ O(n^d)可得  a = 2; b = 2; n^log22 = n, 而后面也是O(n),

            故算法的时间复杂度为T(n) = O(nlogn)。

    空间复杂度:O(n)递归调用。

5.心得体会:

    对于“从一组无序的数据中找到第k小”一类的相似问题,最直接的办法,就是先对这组数据进行排序,使其成为有序的数列,然后就可以在顺序数组中直接找到所需结果。而利用快速排序和递归算法的结合,可以实现在排序的过程中找到所找数据的确定位置,然后直接返回结果。此外,快速排序算法相比于其11它算法,在大规模的数据处理中占着很大的优势。所以,快排的学习对解决问题十分有益。

posted @ 2020-10-06 19:41  zx02  阅读(100)  评论(0编辑  收藏  举报