Bucket Sort in Java

2025年5月3日 | 阅读 6 分钟

桶排序是一种排序技术,其中元素首先被均匀地分成几个称为的组。之后,使用任何排序算法对元素进行排序,最后,将元素收集起来形成一个有序的序列。在本节中,我们将学习桶排序的工作原理、其算法、复杂度、示例以及在 Java 程序中的实现

桶排序

桶排序箱排序是一种排序算法,它通过将元素均匀地分布到多个桶中来工作。然后对每个桶进行单独排序。为了对桶进行排序,我们使用 Arrays 类的 sort() 方法。它通常用于对浮点数进行排序

执行桶排序的基本思想是

  • 将范围划分为固定数量的桶。
  • 将每个元素放入其相应的桶中。
  • 使用插入排序单独对每个桶进行排序。
  • 按顺序连接所有已排序的桶。

优点

  • 由于均匀分布,因此在渐近意义上非常快。
  • 它减少了比较次数。
  • 与冒泡排序相比,它更快。

缺点

  • 它不是原地排序,因为我们需要一些额外的空间来排序桶。
  • 它可能是稳定的排序算法,也可能不是。
  • 如果数组很大,它就不是很有用,因为它会增加成本。

让我们看看算法。

算法

Bucket Sort(A[])

  1. 让 B[0….n-1] 为一个新数组
  2. n=length[A]
  3. for i=0 to n-1
  4. 使 B[i] 为一个空列表
  5. for i=1 to n
  6. 将 A[i] 插入列表 B[n a[i]] 中
  7. for i=0 to n-1
  8. 使用插入排序对列表 B[i] 进行排序
  9. 按顺序连接列表 B[0], B[1],..……, B[n-1]

复杂度

时间复杂度
最坏情况O(n2)
最佳情况O(n+k)
平均情况O(n+k)

桶排序示例

使用桶排序将以下数组按升序排序。

arr[]=22, 45, 12, 8, 10, 6, 72, 81, 33, 18, 50, 14

给定数组中的元素总数 (N) = 12

数组中的最大元素 = 81

数组中的最小元素 = 6

Bucket Sort in Java

我们需要10个桶来对数组进行排序。假设这 10 个桶由B表示。之后,我们需要找到一个分隔符,用于将元素放入桶中。为了确定分隔符,我们使用以下公式

Bucket Sort in Java

将值放入上述公式中,我们得到

Bucket Sort in Java

因此,桶数 = 10,分隔符 = 9

我们将使用以下公式将元素 arr[i] 放入正确的桶中

Bucket Sort in Java

让我们通过将元素放入桶中来查看它是如何工作的。我们将从第一个索引开始。

对于 i=0

Bucket Sort in Java

我们将第零个元素(22)插入第 2 个桶,并将数组索引 (i) 增加 1。

对于 i=1

Bucket Sort in Java

我们将第一个元素(45)插入第 5 个桶,并将数组索引 (i) 增加 1。

对于 i=2

Bucket Sort in Java

我们将第二个元素(12)插入第 1 个桶,并将数组索引 (i) 增加 1。

对于 i=3

Bucket Sort in Java

我们将第三个元素(8)插入第 0 个桶,并将数组索引 (i) 增加 1。

对于 i=4

Bucket Sort in Java

我们将第四个元素(10)插入第 1 个桶,并将数组索引 (i) 增加 1。

对于 i=5

Bucket Sort in Java

我们将第五个元素(6)插入第 0 个桶,并将数组索引 (i) 增加 1。

对于 i=6

Bucket Sort in Java

我们将第六个元素(72)插入第 8 个桶,并将数组索引 (i) 增加 1。

对于 i=7

Bucket Sort in Java

我们将第七个元素(81)插入第 8 个桶,并将数组索引 (i) 增加 1。

对于 i=8

Bucket Sort in Java

我们将第八个元素(33)插入第 3 个桶,并将数组索引 (i) 增加 1。

对于 i=9

Bucket Sort in Java

我们将第九个元素(18)插入第 2 个桶,并将数组索引 (i) 增加 1。

对于 i=10

Bucket Sort in Java

我们将第十个元素(50)插入第 5 个桶,并将数组索引 (i) 增加 1。

对于 i=11

Bucket Sort in Java

我们将第十一个元素(14)插入第 1 个桶,并将数组索引 (i) 增加 1。

Bucket Sort in Java

现在,我们将对各个桶执行插入排序以对元素进行排序。让我们从第一个桶(第 0 个)开始。

是否? 是的,交换它们的位置。

Bucket Sort in Java

现在,转到下一个桶(第 1 个),并比较每个元素与其他元素。

是否? 是的,交换它们的位置并比较下一对。是否? 否,元素已按排序顺序排列,因此我们不会交换它们的位置。

Bucket Sort in Java

现在,转到下一个桶(第 2 个)并比较它们的元素。

是否? 是的,交换它们的位置。

Bucket Sort in Java

现在,我们将转到下一个桶。在这里,需要注意的是,只有一个元素的桶已经排序,而没有元素的桶将被跳过。因此,我们将转到第五个桶并比较它们的元素。

是否? 否,元素已排序。同样,跟踪桶,直到我们到达最后一个桶。因此,我们在这里停止,因为我们已经得到了一个已排序的数组。

Bucket Sort in Java

最后,我们将从每个桶中取出所有元素。因此,我们得到一个已排序的数组。

Bucket Sort in Java

我们已经理解了桶排序的逻辑。让我们在 Java 程序中实现该逻辑,并执行数组的桶排序。

桶排序 Java 程序

BucketSortExample1.java

输出

Unsorted Array: [22, 45, 12, 8, 10, 6, 72, 81, 33, 18, 50, 14, 55, 0, 12, 55]
Sorted Array: [0, 6, 8, 10, 12, 12, 14, 18, 22, 33, 45, 50, 55, 55, 72, 81]

让我们创建另一个 Java 程序,该程序随机生成数组元素并使用桶排序对它们进行排序。

BucketSortExample2.java

输出

Sorted array after performing bucket sort:

Un-sorted Array: 
16, 1, 0, 6, 14, 4, 22, 19, 37, 34, 17, 39
Sorted Array: 
0, 1, 4, 6, 14, 16, 17, 19, 22, 34, 37, 39