Java 中的计数排序

2025年5月12日 | 阅读 5 分钟

计数排序是 Java 中最常用的排序技术之一,它基于给定范围内的键进行排序。计数排序不通过比较元素来排序,而是通过计算具有不同键值的对象的数量来实现排序,类似于哈希。之后,它会执行一些算术运算来计算每个对象在输出序列中的索引位置。计数排序算法不被用作通用排序算法。

假设我们有一个输入数组 a{4, 3, 2, 5, 4, 3, 5, 1, 0, 2, 5},其值在范围 [0, 5] 内。

Counting sort in Java

我们计算数组中每个元素的出现次数,并将计数表示为数组 countArraycountArray[i] 表示数字 i 在数组 a 中的出现次数。

Counting sort in Java

因此,数字 0 和 1 各出现一次,2、3 和 4 各出现两次,5 出现三次。

Counting sort in Java

现在,借助 countArray,我们确定数组 a 中有多少个元素小于或等于 countArray 的每个元素。我们将小于或等于 countArray[i] 的所有元素相加。

在数组 a 中,

  1. 只有一个元素,即 0,小于或等于零,这等于 countArray[0]
  2. 有两个元素小于或等于 1,即 0 和 1,这等于 countArray[0] + countArray[1]
  3. 有 4 个值小于或等于 2,即 0、1、2 和 2,这等于 countArray[0]+ countArray[1]+ countArray[2]
  4. 有 6 个值小于或等于 3,即 0、1、2、2、3、3,这等于 countArray[0]+ countArray[1]+ countArray[2] ]+ countArray[3]
  5. 有 6 个值小于或等于 3,即 0、1、2、2、3、3,这等于 countArray[0]+ countArray[1]+ countArray[2] ]+ countArray[3]
  6. 有 6 个值小于或等于 4,即 0、1、2、2、3、3、4、4,这等于 countArray[0]+ countArray[1]+ countArray[2] ]+ countArray[3] + countArray[4]
  7. 有 6 个值小于或等于 5,即 0、1、2、2、3、3、4、4、5、5、5,这等于 countArray[0]+ countArray[1]+ countArray[2] ]+ countArray[3] + countArray[4] + countArray[5]

算法

在获得 辅助 数组,即 countArray 后,我们进行排序以对数组 a 进行排序。以下是排序数组 a 元素的步骤。

  1. 以反向形式遍历输入数组 'a'
  2. 对于输入数组中的每个元素 'i',C[i] 定义了数字 i 在排序数组中的位置,因为有 countArray[i] 个元素小于或等于 i。
  3. 在每轮结束时,我们将 countArray[i] 减一。

因此,为了对输入数组 a 进行排序,我们反向遍历它,并从数字 5 开始。在 countArray 的索引 5 处,值为 11,这意味着数组 'a' 包含 11 个小于或等于数字 5 的元素。这意味着 5 将是排序数组中的最后一个元素。

Counting sort in Java

在将数字 5 移动到排序数组后,我们将 countArray[5] 的值减一。现在,反向顺序中的下一个数字是 2,在索引 2 处,值为 4,这意味着数组 'a' 包含四个小于或等于 2 的元素。因此,该数字将在排序数组中的第 4 个位置。

Counting sort in Java

输入数组 'a' 中的下一个数字是 0,countArray 中索引 0 的值为 1,这意味着输入数组 'a' 中只有一个元素等于 0。因此,0 将是排序数组中的第一个元素。

Counting sort in Java

我们对输入数组 'a' 的其余元素执行相同的操作。

对于元素 1

Counting sort in Java

对于元素 5

Counting sort in Java

对于元素 3

Counting sort in Java

对于元素 4

Counting sort in Java

对于元素 5

Counting sort in Java

对于元素 2

Counting sort in Java

对于元素 3

Counting sort in Java

对于元素 4

Counting sort in Java

排序数组

Counting sort in Java

让我们使用上面讨论的算法在 Java 中实现计数排序的逻辑。

CountingSortExample.java

输出

Counting sort in Java