一、桶排序的思想简介
根据某种规则将数据分散到有限的桶中,对每个桶中的数据进行单独排序,最后再合并桶中元素,得到结果。
二、示例
一组数据{19,9,21,1,11,8}根据每个桶的范围进行分组,再对每个桶进行排序,最后再合并得到排序结果。
三、关于排序分组规则的分析
根据如上示例可以看出,分组规则的设计应与两个指标有关。
1)桶的数量
桶的数量不能太少,这样数据会过于集中,从而导致时间复杂度增加。
但是数量也不能过多,这样会增加空间复杂度。
桶的数量也决定了一个桶包含待排序数的范围
所以桶的数量要合适。
2)每个桶中待排序数的范围
每个桶应容纳整个数据中某一范围的数据,当然这个范围不一定如上示例一样是平均分配,也可根据数据的松散程度划分,让数据不那么集中在一个桶中,提高算法效率。
但是这样会导致另一个问题,除非有特殊需要,我们不可能总是修改桶包含数据的范围,数据过多我们也不好找出合适的分组规则。
根据以上问题可以采用以下规则进行分组来使其对大多数数据可用
1)桶的数量通过传参输入或者采用数据的长度或比数据长度略少。
2)每个桶包含待排序的数的范围采用平均分配的方式,避免手动分配使其达到通用的目的。
四、桶中待排序数范围的具体分配方式
1、找出这组数据的最大值max,最小值min
2、这组数据都减去最小值,得到一组范围在[0,max-min]之间的数据
3、 L= (max-min) / n-1 (n为桶数,L为每段的长度)得到n段
4、将原来那组数据转化为[0,max-min]中的数据 / L 就可以得到其要分配桶的下标
示例如下:
一组数据:19,9,21,1,11,8, 假设桶数n = 5
max = 21,min = 1
max - min = 20
L = 20 / 5 = 4
(19 - 1) / 4 = 4
(9 - 1) / 4 = 2
(21 - 1) / 4 = 4
(1 - 1) / 4 = 0
(11 - 1) = 2
(8 - 1) = 1
桶1(1),桶2(8),桶3(9,11),桶4(),桶5(19,21),