如何在 Java 中排序数组?

2025年5月14日 | 阅读10分钟

在 Java 中,sort() 方法java.util.Arrays 类中定义的一个静态重载方法。它用于对不同类型数组的值进行排序。排序顺序可以是升序或降序。数值顺序字典序(字母顺序)是广泛使用的。

sort() 方法可以应用于基本类型(int、char、double、float 等)和对象类型(String、Integer、Double 等)。请注意,该方法对基本类型使用双轴快速排序算法,对对象数组使用修改后的归并排序,从而确保高效排序。

每个 sort() 方法提供以下两种变体

  1. 对整个数组进行排序(可以是整数或字符数组)
  2. 通过传递起始和结束索引来对特定范围进行排序。

按升序排序数组

升序是将元素从最低顺序排列到最高顺序。它也称为自然顺序数值顺序。我们可以通过以下方式进行排序

  • 使用 sort() 方法
  • 不使用方法
    • 使用用户定义的方法

使用 sort() 方法

在 Java 中,Arrays 是定义在 java.util 包中的类,它提供了一个 sort() 方法来按升序对数组进行排序。它使用双轴快速排序算法进行排序。其复杂度为 O(n log(n))。这是一个静态方法,它将数组作为参数,并且不返回任何内容。我们可以直接使用类名调用它。它接受 int、float、double、long、char 和 byte 类型的数组。

语法

其中a是要排序的数组。

注意:与 Arrays 类类似,Collections 类也提供了 sort() 方法来对数组进行排序。但它们之间存在差异。Arrays 类的 sort() 方法适用于基本类型,而 Collections 类的 sort() 方法适用于对象集合,例如 LinkedList、ArrayList 等。

让我们使用 Arrays 类的 sort() 方法对数组进行排序。

在下面的程序中,我们定义了一个整型数组。之后,我们调用 Arrays 类的 sort() 方法并解析要排序的数组。为了打印排序后的数组,我们使用了一个 for 循环。

示例

编译并运行

输出

Elements of array sorted in ascending order:  5, 12, 22, 23, 34, 67, 90, 109

在上面的程序中,我们也可以使用 Arrays 类 的 toString() 方法来打印数组,如下面的语句所示。它返回指定数组的字符串表示形式。

不使用方法

使用 for 循环

在下面的示例中,我们初始化了一个整数类型的数组并按升序对数组进行了排序。

示例

编译并运行

输出

Array elements after sorting: -65, -4, -1, 1, 3, 6, 20, 34, 34, 55, 78, 90

使用用户定义的方法

在下面的示例中,我们定义了一个名为 **sortArray()** 的方法,该方法包含按自然顺序排序数组的逻辑。

示例

编译并运行

输出

Array elements before sorting: 12, 45, 1, -1, 0, 4, 56, 23, 89, -21, 56, 27
Array elements after sorting: -21, -1, 0, 1, 4, 12, 23, 27, 45, 56, 56, 89

按降序排序数组

降序是将元素从最高顺序排列到最低顺序。我们可以通过以下方式进行排序

  1. 使用 reverseOrder() 方法
  2. 不使用方法
    1. 使用 for 循环
    2. 使用用户定义的方法

使用 reverseOrder() 方法

Java Collections 类 提供了 reverseOrder() 方法来按反向字典序对数组进行排序。这是一个静态方法,因此我们可以直接使用类名调用它。它不解析任何参数。它返回一个强制自然排序(升序)反序的比较器。

这意味着使用 sort() 方法对数组按升序排序,然后 reverseOrder() 方法反转自然顺序,我们得到按降序排序的数组。

语法

假设 a[] 是一个要按降序排序的数组。我们将以以下方式使用 reverseOrder() 方法

让我们按降序对数组进行排序。

在下面的程序中,需要注意的一点是我们已将数组定义为 Integer。因为 reverseOrder() 方法不适用于基本数据类型。

示例

编译并运行

输出

Array elements in descending order: [205, 110, 102, 78, 23, 11, 6, 4, 0, -1, -9]

让我们看另一个对数组元素按字母顺序排序的程序。

示例

编译并运行

输出

Array elements in descending order: [Papaya, Pineapple, Orange, Mango, Grapes, Banana, Apple]

不使用方法

使用 for 循环

在下面的示例中,我们初始化了一个整数数组并按降序进行了排序。

示例

编译并运行

输出

Array elements in descending order: 94, 56, 43, 32, 12, 9, 5, 2, -2, -26, -78

使用用户定义的方法

示例

编译并运行

输出

Array elements in descending order: 94, 56, 43, 12, 5, -78

如何排序子数组?

从另一个数组派生的数组称为子数组。假设 a[] 是一个包含元素 [12, 90, 34, 2, 45, 3, 22, 18, 5, 78] 的数组,并且我们想对从 34 到 18 的数组元素进行排序。它将对子数组 [34, 2, 45, 3, 22, 18] 进行排序,而其他元素保持不变。

要对子数组进行排序,Arrays 类提供了名为 sort() 的静态方法。它将数组的指定范围按升序排序。我们也可以对 long、double、float、char、byte 等类型的数组进行排序。

语法

该方法解析以下三个参数

  • a:要排序的数组。
  • fromIndex:子数组第一个元素的索引。它参与排序。
  • toIndex:子数组最后一个元素的索引。它不参与排序。

如果 fromIndex 等于 toIndex,则要排序的范围为空。如果 fromIndex 大于 toIndex,则抛出 IllegalArgumentException。如果 fromIndex < 0 或 toIndex > a.length,它还会抛出 ArrayIndexOutOfBoundsException。

让我们通过一个 Java 程序对子数组进行排序。

示例

编译并运行

输出

12, 90, 2, 3, 22, 34, 45, 18, 5, 78

使用 Stream API

Java 允许对集合进行函数式操作,包括排序。以下是我们可以详细使用 Stream API 对元素进行排序的方法

  1. 获取流:首先,从要排序的集合或数组中获取流。
  2. 使用 sorted() 方法:使用 sorted() 方法对流中的元素进行排序。我们可以选择性地提供一个比较器来指定自定义排序标准。
  3. 收集排序后的流:将排序后的元素从流收集到集合或数组中。

示例

编译并运行

输出

Sorted Array: 1, 2, 3, 5, 9

使用 Arrays.parallelSort() 方法(Java 8 及更高版本)

Java 中的 Arrays.parallelSort() 方法(在 Java 8 中引入)使用并行性有效地对大型数组进行排序。与以单线程顺序方式排序的 Arrays.sort() 不同,Arrays.parallelSort() 利用 ForkJoin 框架将数组分割成更小的子数组,然后并行排序它们,最后合并结果。

示例

编译并运行

输出

Sorted Array: 1, 2, 3, 5, 9

排序算法根据给定的顺序组织元素,而像冒泡排序、选择排序、插入排序、归并排序、快速排序和堆排序等技术提供了不同的效率和特性来将数据按给定顺序排列。

结论

Java Arrays.sort() 方法是一个极其强大且用途广泛的工具,它不仅可以对原始数组进行排序,还可以对对象数组进行排序。其简单的语法和重载方法使得开发人员能够执行从一维基本数值排序到带有比较器的复杂自定义逻辑的任何操作。它通过针对原始类型的双轴快速排序等优化算法,很好地支持了广泛的应用场景。

无论我们是在创建小型实用工具还是更复杂的应用程序,您都会发现 Arrays.sort() 对于管理数据、编写更清晰的代码以及开发设计更优良的软件非常有益。

Java Arrays.sort() 选择题

1. 应该使用哪种方法来排序整数类型的子数组?

  1. sort(int[] a)
  2. sort(int[] a, int fromIndex)
  3. sort(int[] a, int fromIndex, int toIndex)
  4. sort(Integer[] a)

答案3)

解释:当我们将数组的指定范围按升序排序时,我们使用 Arrays.sort(int[] a, int fromIndex, int toIndex)


2. sort() 方法使用哪种算法对基本类型进行排序?

  1. 双轴快速排序
  2. 轴快速排序
  3. 快速排序
  4. 轴排序

答案1)

解释:sort() 方法对基本类型使用双轴快速排序算法


3. sort() 方法使用哪种算法对对象类型进行排序?

  1. 双轴归并排序
  2. 快速排序
  3. 合并排序
  4. 修改后的归并排序

答案1)

解释:sort() 方法对对象类型数组使用修改后的归并排序算法。


4. sort() 方法定义在哪个类中?

  1. io.Arrays 类
  2. util.Arrays 类
  3. lang.Arrays 类
  4. util.Array 类

答案2)

解释:sort() 方法定义在 java.util.Arrays 类中。


5. sort() 方法是 Arrays 类的 _______ 方法?

  1. 重载方法
  2. 抽象方法
  3. 静态方法
  4. 仅 1 和 3

答案2)

解释:sort() 方法是 Arrays 类的静态重载方法。


下一个主题Java 教程