在路上

不是专业,只会通俗

导航

排序算法_桶排序(箱排序)

一、算法描述

假设有一组长度为N的待排关键字序列K[1....n]。

  1. 首先将这个序列划分成M个的子区间(桶)。
  2. 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就作为B[i]中的元素(每个桶B[i]都是一组大小为N/M的序列)。
  3. 对每个桶B[i]中的所有元素进行比较排序(可以使用快排)。
  4. 然后依次枚举输出B[0]....B[M]中的全部内容即是一个有序序列。

二、图示

假如待排序列K= {49、38 、35、 97 、 76、 73 、 27、 49 }。
这些数据全部在1—100之间。因此我们定制10个桶,然后确定映射函数f(k)=k/10。
则第一个关键字49将定位到第4个桶中(49/10=4)。
依次将所有关键字全部堆入桶中,并在每个非空的桶中进行快速排序后得到如下图所示:

          
对上图只要顺序输出每个B[i]中的数据就可以得到有序序列了。

三、性能描述

    数据结构 :数组

  最差时间复杂度 :O(n2)

  平均时间复杂度 :O(n+k)

  最差空间复杂度 :O(n*k)

四、总结

  1. 箱排序费空间。
  2. 箱排序只适用于关键字取值范围较小的情况,否则所需箱子的数目m太多导致浪费存储空间和计算时间。

五、伪代码

void BucketSon(R)
     { //对R[0..n-1]做桶排序,其中0≤R[i].key<1(0≤i<n)
       for(i=0,i<n;i++) //分配过程.
         将R[i]插入到桶B[「n(R[i].key)」]中; //可插入表头上
       for(i=0;i<n;i++) //排序过程
         当B[i]非空时用插人排序将B[i]中的记录排序;
       for(i=0,i<n;i++) //收集过程
         若B[i]非空,则将B[i]中的记录依次输出到R中;
      }

 

 

 

 参考文档:

  1. 图解"数据结构-内部排序算法"分配排序:箱排序、基数排序

   http://www.myexception.cn/other/918080.html

  2. http://zh.wikipedia.org/wiki/桶排序

 

posted on 2013-01-18 12:15  OnRoad_  阅读(1552)  评论(0编辑  收藏  举报