排序算法_桶排序(箱排序)
一、算法描述
假设有一组长度为N的待排关键字序列K[1....n]。
- 首先将这个序列划分成M个的子区间(桶)。
- 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就作为B[i]中的元素(每个桶B[i]都是一组大小为N/M的序列)。
- 对每个桶B[i]中的所有元素进行比较排序(可以使用快排)。
- 然后依次枚举输出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)
四、总结
- 箱排序费空间。
- 箱排序只适用于关键字取值范围较小的情况,否则所需箱子的数目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/桶排序