桶排序 Bin Sort


 
 

桶排序 Bin Sort

平均情况下桶排序以线性时间运行。像计数排序一样,桶排序也对输入作了某种假设, 因而运行得很快。具体来说,计数排序假设输入是由一个小范围内的整数构成,而桶排序则 假设输入由一个随机过程产生,该过程将元素一致地分布在区间[0,1)上。

桶排序的思想就是把区间[0,1)划分成n个相同大小的子区间,或称桶,然后将n个输入数分布到各个桶中去。因为输入数均匀分布在[0,1)上,所以一般不会有很多数落在 一个桶中的情况。为得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列 出来即可。

在桶排序算法的代码中,假设输入是个含n个元素的数组A,且每个元素满足0≤ A[i]<1。另外还需要一个辅助数组B[O..n-1]来存放链表实现的桶,并假设可以用某种机制来维护这些表。

桶排序的算法如下,其中floor(x)是地板函数,表示不超过x的最大整数。

procedure Bin_Sort(var A:List);
begin
1  n:=length(A);
2  for i:=1 to n do
3    将A[i]插到表B[floor(n*A[i])]中;
4  for i:=0 to n-1 do
5    用插入排序对表B[i]进行排序;
6  将表B[0],B[1],...,B[n-1]按顺序合并;
end;

 

图1 Bin_Sort的操作

图1演示了桶排序作用于有10个数的输入数组上的操作过程。(a)输入数组A[1..10]。(b)在该算法的第5行后的有序表(桶)数组B[0..9]。桶i中存放了区间[i/10,(i+1)/10]上的值。排序输出由表B[O]、B[1]、...、B[9]的按序并置构成。

要说明这个算法能证确地工作,看两个元素A[i]和A[j]。如果它们落在同一个桶中,则它们在输出序列中有着正确的相对次序,因为它们所在的桶是采用插入排序的。现假设它们落到不同的桶中,设分别为B[i']和B[j']。不失一般性,假设i'<j'。在算法的代码中,当第6行中将B中的表并置起来时,桶B[i']中的元素先于桶B[j']中的元素,因而在输出序列中A[i]先于A[j]。现在要证明A[i]≤A[j]。假设情况正好相反,我们有:

 i'=floor(n*A[i])≥floor(n*A[j])=j'

得矛盾 (因为i'<j'),从而证明桶排序能正确地工作。

现在来分析算法的运行时间。除第5行外,所有各行在最坏情况的时间都是O(n)。第5行中检查所有桶的时间是O(n)。分析中唯一有趣的部分就在于第5行中插人排序所花的时间。

为分析插人排序的时间代价,设ni为表示桶B[i]中元素个数的随机变量。因为插入排序以二次时间运行,故为排序桶B[i]中元素的期望时间为E[O(ni2)]=O(E[ni2]),对各个桶中的所有元素排序的总期望时间为:

(1)

为了求这个和式,要确定每个随机变量ni的分布。我们共有n个元素,n个桶。某个元素落到桶B[i]的概率为l/n,因为每个桶对应于区间[0,1)的l/n。这种情况与投球的例子很类似:有n个球 (元素)和n个盒子 (桶),每次投球都是独立的,且以概率p=1/n落到任一桶中。这样,ni=k的概率就服从二项分布B(k;n,p),其期望值为E[ni]=np=1,方差V[ni]=np(1-p)=1-1/n。对任意随机变量X,有:

  (2)

将这个界用到(1)式上,得出桶排序中的插人排序的期望运行时间为O(n)。因而,整个桶排序的期望运行时间就是线性的。

下面的Java Applet程序演示了桶排序的基本思想。

很抱歉,您的浏览器不支持Java Applet或者没有打开Java Applet支持。

在该演示程序中,线性表的元素类型为整型,桶的标号为整数,算法将值为i的元素放入标号为i的桶中,再按照桶的标号的顺序将元素依次取出,就得到了最终的排序结果。

返回页首


本页最后一次更新于10/13/2003
Email: Starfish.H@China.com
©2000 算法与数据结构 http://algorithm.126.com/ 版权所有 转载请保留出处

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值