bfprt算法

        转自bfprt算法中的部的那内容:

          快速排序算法,将原始数据划分为两个部分,在分别对两部分数据按同样的方法分治递归,通过不断的递归将大的问题划分为2个小的字问题,达到快速的目的,算法的平均时间复杂度为O(n*logn), 这里的枢纽元的选择很关键,如果选择的是最大值或是最小值,那么划分的连个子问题将会严重不平衡,算法的最坏复杂度将会达到O(n*n)。关于枢纽元的选择,在算法导论或是Mark Allen Weiss的数据结构中都有详细的讨论,主要有随机选择,三元素取中值,五划分中项的中项法。


      五划分中项的中项法就是BFPRT算法。Mark Allen Weiss的数据结构中P282中介绍了此算法,并给出了相关证明:
      1.此算法可以保证每个递归的子问题的大小最多是原问题的的大约70%
      2.对于整个选择算法,枢纽元可以足够算法算出,保证O(n)的运行时间
      这里的算法复杂度的分析,可以参看相关书籍和本文最后列出的大神博客,本文不做叙述。
     这里有一个福州大学的教学视频, http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=82,感谢这个视频的创作者,关于算法的讲解用视频的方式最能够让人理解了。
     下面是算法主要步骤:
     其中有些细节的处理,主要是边界问题还是比较关键,后面会给出这些问题。
     数据有n个,取出最小的k个数字
     终止条件:n=1时,返回的即是i小元素。
     算法步骤:
     step1:将n个元素每5个一组,分成n/5(上界)组,最后的一个组的元素个数为n%5,有效的组数为n/5。
     step2:取出每一组的中位数,最后一个组的不用计算中位数,任意排序方法,这里的数据比较少只有5个,
                  可以用简单的冒泡排序或是插入排序。
     setp3 :  将各组的中位数与数组开头的数据在组的顺序依次交换,这样各个组的中位数都排在了数据的左边。
                  递归的调用中位数选择算法查找上一步中所有组的中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。
     setp4:   按照x划分,大于或者等于x的在右边,小于x的在左边,关于setp4数据的划分,中位数放在左边或是右边会有些影响。
                  后面的代码调试将会看到。
     step5:setp4中划分后数据后返回一个下表i,i左边的元素均是小于x,i右边的元素包括i都是大于或是等于x的。
                  若i==k,返回x;
                  若i                   若i>k,在大于等于x的元素中递归查找第i-k小的元素。

你可能感兴趣的:(IT面试)