排序之五(顺序统计、中位数法)

         作为排序的一个扩展,给定一个含n个元素的无序数组,求第k小的数。

         K取特殊值:如1或n,这时为求最小或最大值。只需要扫描一遍数组,记录下小的或大的数,只需要n-1次比较即可。如果要同时求最大和最小值,则一个方法可以先求最大,再求最小,可以在2*(n-1)比较解决;另一个方法是每次处理两个元素,先新的两个元素比较,再将大的和当前最大值比较,小的和当前最小值比较,这样每2个元素只需要3次比较,总比较次数为3*[n/2],比方法一比较次数少。

         最大值和最小值都可以在O(n)的时间内解决。因此引出任何k,是否也可以在O(n)解决?答案是肯定的,可以。

1.        顺序统计

顺序统计是从无序的n个元素的数组中找出第i小的数。

方法:

排序法:先排序最好O(nlgn),再选第k个元素。时间为O(nlgn)。

随机算法:使用快速排序的思想,将数进行划分,与快排不同,划分后只需要处理一边,不需要处理两边。

算法通过使用随机化快排的划分函数来进行选择。Select(A,p,r,i)。返回A中p到r之间第i大的。

随机化划分的主元下标为q。如果主元的位置k(q-p+1)和i相同,则主元为所求。否则如果i小于k则,第i大的在左边,且仍未第i大的,继续Select(A,p,q-1,i);否则第i大的在右边,且为第i-k大的,继续Select(A,q+1,r,i-k)。

复杂度分析

空间为:O(1).

时间:和快排一样。最差情况,每次划分主元为剩下元素中的最大值,则为O(n^2)。

但是由于算法是随机的,因此没有那种特殊输入会导致最坏情况发生。平均的时间复杂度,使用和随机化快排相同的思路,使用示性函数可以求解。为O(n)。

从而对任何的k值,期望时间都为O(n)。

2.        中位数法

由随机化算法。时间复杂度最坏有可能为O(n^2),虽然平均为O(n)。因此等于O(n)。

中位数法则在最坏情况下限定任何i小的统计,时间都为O(n)。

中位数法:

²  将元素按五行进行排列。最后一列不足不要紧。

²  对每列元素使用插入排序(每列最多5个元素),选出每列的中位数(最多n/5+1个)

²  对这n/5+1个数递归使用前两步。直到找出这n/5+1个数的中位数为止,每列按中位数重新排好后,中位数的中位数x下标为k。

²  使用中间行的n/5+1个数的中位数x(下标为k)对整个数组进行划分,划分为低区和高区。

²  如果i=k则x为k大的。如果i<k,则第i大的在低区,而由划分比k大的部分,其中下部分一定比x大,这部分元素个数约为3*n/10因此递归的对另外7*n/10使用递归算法。反之,i>k,则第i大的在高区,而由划分比k小的部分,其中上部分一定比x小,这部分元素个数也约为3*n/10,因此递归对另外部分7*n/10使用递归算法。从这一步在递归的过程中,子问题规模最多为7*n/10。

复杂度分析

第1,2,4部分只需要O(n)。第3部分为递归的n/5,第5部分为递归的7*n/10。从而可以归纳证明,时间复杂度为O(n)。从而中位数法的时间为线性的。

 

3.        扩展

²  中位数法中,5行划分的方法对大于5的基数如7也适用。但是其O(n)中的因子比较大。但是对于3行划分,则时间不能提高到O(n)。

²  使用该法,可以将快排的最差时间提高到O(nlgn),而不是平均时间为O(nlgn)。方法是先查找出数组中的中位数,时间为O(n),在以中位数为主元进行划分,这样最坏时间就降为O(nlgn)。

²  K中位数的概念,可以将数组均分为k个大小相等的k-1个值。

²  这部分的思想是基于顺序统计,而不是动态统计的。因此对于第k大的方法,还可以使用堆的做法。

顺序统计和动态统计区别在于,前者是可以对整个数组进行一次处理,且已知数组大小;动态统计则可以先不必知道数组中元素的多少,且数据可能不是一次到达。

重点区别是:静态顺序统计中,数组内容是不会有增加、删除的。动态顺序统计中,元素可能有增减。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值