一句话总结:空间换速度,空间损耗量大,但速度快!
桶排序的基本思想:
假设有一组长度为N的待排序列A[1....n]处于某一个较确定的区间内.另外还有一个辅助数组B[o,n-1]来存放待排序列中的元素,而数组B就相当于桶的集合。然后将A内的元素以某一个规则放入到数组B中对应的位置(即对应的桶中),最后将数组B中非空桶的元素依次输出。
适用范围:
数据的长度需大致相同,且在一个较集中的范围内
待排序元素越均匀, 桶排序的效率越高.
基本步骤:
1、设置一个定量的数组当作空桶子。
2、寻访序列,并且把项目一个一个放到对应的桶子去。
3、对每个不是空的桶子进行排序。
4、从不是空的桶子里把项目依次输出。
算法分析:
桶排序基于映射函数i=f(k) 其中,i 为桶数组a的下标(即第i个桶), k为待排序列的关键字。如果关键字k1<k2,那么f(k1)<=f(k2)。也就是说a(i)中的最小数据都要大于a(i-1)中最大数据。很显然,映射函数的确定与数据本身的特点有很大的关系,我们下面举个例子:
1、 假如待排序列K= {5、 3 、 10、8 、 2、 4 、5、 7 }。
2、 这些数据全部在1—10之间。因此我们定制10个桶,且每个桶内的初始值为0,然后确定映射函数f(k)=i(i=k){式1}。
3、 若有一个符合条件的k进入桶中,桶中值变为a(i)= a(i)+1(式2)。
4、 第一个关键字5将定位到下角标为5的桶中,即第5个桶中,此时桶a(5)执行式2,a(5)中的值变为1。
5、 第二个到第六个元素以此桶中,第七个元素与第一个重复,此时再以此执行式2,a(5)中元素变为2.,然后将第八个元素归入第七个桶中,得到如下图所示:
6、 然后在非空桶内排序,按顺序输出:2、3、4、5、5、7、8、10
代码:
优点:
1,桶排序利用函数的映射关系,减少了一大部分的比较工作。
2,桶排序是常见排序里最快的一种。
3, 对于数据范围较几种,且有规律的一列数,非常使用
缺点:
1,如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。
2,使用范围有限,如果数据量大,且数据分布范围广,则不适宜
启示:
桶排序对于一系列有规律且在一定范围的数值排序是相当快的,根据桶排序的使用范围以及优点,可以将其运用在有规律的字符串的“排序”,比如身份证,汽车车牌号,甚至是酒店的房号等,然后发挥它的最大价值。