码迷,mamicode.com
首页 > 其他好文 > 详细

第二章上机实验报告

时间:2020-10-07 20:23:50      阅读:26      评论:0      收藏:0      [点我收藏+]

标签:时间   排序算法   排列   mil   解决   空间   family   体会   排序   

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它算法,在大规模的数据处理中占着很大的优势。所以,快排的学习对解决问题十分有益。

第二章上机实验报告

标签:时间   排序算法   排列   mil   解决   空间   family   体会   排序   

原文地址:https://www.cnblogs.com/zhangxin0219/p/13774322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!