Data Structures Algorithms 简明教程

Bucket Sort Algorithm

Bucket 排序算法类似于 Counting Sort 算法,因为它是计数排序的广义形式。Bucket 排序假设输入元素是从区间 [0, 1) 上的均匀分布中提取的。

因此,Bucket 排序算法将区间 [0, 1) 划分为“n”个相等的部分,并将输入元素添加到索引存储桶中,其中索引基于 (n × 元素) 值的下限。由于该算法假设值是均匀分布在小范围内的独立数字,所以很少有元素仅落入一个存储桶中。

例如,我们来看一个元素输入列表 0.08、0.01、0.19、0.89、0.34、0.07、0.30、0.82、0.39、0.45、0.36。Bucket 排序看起来像 −

bucket sort

Bucket Sort Algorithm

让我们看看这个算法将如何继续如下 −

*步骤 1 *− 将区间划分为“n”个相等的部分,每个部分称为一个存储桶。如果 n 为 10,则有 10 个存储桶;否则更多。

*步骤 2 *− 从输入数组 A 中获取输入元素,并根据计算公式 B[i]= $\lfloor$n.A[i]$\rfloor$ 将它们添加到这些输出存储桶 B 中

*步骤 3 *− 如果有任何元素被添加到已占用的存储桶中,则通过相应的存储桶创建一个链表。

*步骤 4 *− 然后我们应用插入排序来对每个存储桶中的所有元素进行排序。

*步骤 5 *− 将这些存储桶串联在一起,然后得到输出。

Pseudocode

BUCKET-SORT(A)
let B[0 … n – 1] be a new array
n = A.length
for i = 0 to n – 1
   make B[i] an empty list
for i = 1 to n
   insert A[i] into list B[$\lfloor$𝑛.𝐴[𝑖]$\rfloor$]
for i = 0 to n – 1
   sort list B[i] with insertion sort
concatenate the lists B[0], B[1]; ………… ; B[n – 1] together in order

Analysis

Bucket 排序算法假设输入的恒等性,因此该算法的平均情况时间复杂度为 Θ(n)

Example

考虑一个元素输入列表 0.78、0.17、0.93、0.39、0.26、0.72、0.21、0.12、0.33、0.28,使用 Bucket 排序对这些元素进行排序 −

Solution

Step 1

从输入数组的索引“0”开始线性插入所有元素。也就是说,我们首先插入 0.78,然后按顺序插入其他元素。使用公式 − B[i]= $\lfloor$n.A[i]$\rfloor$,即,$\lfloor$10 ×0.78$\rfloor$=7 获得插入元素的位置

insert element

现在,我们在索引 $\lfloor$10 ×0.17$\rfloor$=1 处插入 0.17

insert at index 1

Step 3

将下一个元素 0.93 插入输出存储桶中,位置为 $\lfloor$10 ×0.93$\rfloor$=9

insert at index 9

Step 4

使用公式 $\lfloor$10 ×0.39$\rfloor$=3,在索引 3 处插入 0.39

insert at index 3

Step 5

在位置 $\lfloor$10 ×0.26$\rfloor$=2 插入输入数组中的下一个元素 0.26

insert at index 2

Step 6

这里开始变得棘手. 输入列表中的下一个元素是 0.72,它需要使用公式 $\lfloor$10 ×0.72$\rfloor$=7 插入到索引“7”。但是,第 7 个存储槽中已经有一个数字了。所以,从第 7 个索引创建一个链接来存储新数字,就像一个链表,如下所示 −

insert index at 7 new value

Step 7

以类似的方式将余下数字添加到存储槽中,方法是从所需的存储槽创建链表。但是在将这些元素作为列表插入时,我们应用插入排序,即比较两个元素并在前面添加最小值,如下所示 −

apply insertion sort

Step 8

现在,为了获得输出,将所有存储槽连接在一起。

0.12, 0.17, 0.21, 0.26, 0.28, 0.33, 0.39, 0.72, 0.78, 0.93

Implementation

桶排序算法的实现首先检索数组的最大元素并确定输出的存储槽大小。根据一些计算将元素插入到这些存储槽中。

在本教程中,我们用四种编程语言执行桶排序。