Problem6816--学习系列——排序—— 桶排序(Bucket sort)

6816: 学习系列——排序—— 桶排序(Bucket sort)

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 256 MiB

Description

【算法思路】
桶排序是将待排序集合中处于同一个值域的元素存入同一个桶中,也就是根据元素值特性将集合拆分为多个区域,则拆分后形成的多个桶,从值域上看是处于有序状态的。对每个桶中元素进行排序,则所有桶中元素构成的集合是已排序的。

【算法详解】
桶排序的思想近乎彻底的分治思想。算法的过程描述如下:
  1. 根据待排序集合中最大元素和最小元素的差值范围和映射规则,确定申请的桶个数;
  2. 遍历待排序集合,将每一个元素移动到对应的桶中;
  3. 对每一个桶中元素进行排序,并移动到已排序集合中。
桶排序过程中存在两个关键环节:
  1. 元素值域的划分,也就是元素到桶的映射规则。映射规则需要根据待排序集合的元素分布特性进行选择,若规则设计的过于模糊、宽泛,则可能导致待排序集合中所有元素全部映射到一个桶上,则桶排序向比较性质排序算法演变。若映射规则设计的过于具体、严苛,则可能导致待排序集合中每一个元素值映射到一个桶上,则桶排序向计数排序方式演化。
  2. 排序算法的选择,从待排序集合中元素映射到各个桶上的过程,并不存在元素的比较和交换操作,在对各个桶中元素进行排序时,可以自主选择合适的排序算法,桶排序算法的复杂度和稳定性,都根据选择的排序算法不同而不同。
下面我们用一个实例来说明。待排序集合为:[-7, 51, 3, 121, -3, 32, 21, 43, 4, 25, 56, 77, 16, 22, 87, 56, -10, 68, 99, 70],映射规则为:$f(x)=\frac{x}{10}-c$,其中常量: $c=\frac{\text{min}}{10}$,即以间隔大小 $10$ 来区分不同值域。

第一步
遍历集合可得,最大值为:$121$,最小值为:$-10$,待申请桶的个数为:$\frac{\text{max}}{10}-\frac{\text{min}}{10}+1=12-(-1)+1=14$。

第二步
遍历待排序集合,依次添加各元素到对应的桶中。
桶下标
桶中元素
0 -7, -3, -10
1 3, 4
2 16
3 21, 25, 22
4 32
5 43
6 51, 56, 56
7 68
8 77, 70
9 87
10 99
11
12
13 121


第三步
对每一个桶中元素进行排序,并移动回原始集合中,即完成排序过程。

图解算法

【动画展示】

Source/Category