如何在 Java 中使用 ArrayList 合并排序

ArrayList 是 Java 中常用的动态数组,它可以根据需要自动扩容或缩小。在处理数据集合时,排序算法是不可或缺的。本文将介绍如何使用 ArrayList 实现合并排序算法。

合并排序算法是一种基于分治思想的排序算法。算法思路是将原始数组不断分割成两个子数组,对子数组排序后再将其合并起来,最终得到有序数组。在 Java 中,我们可以使用 ArrayList 实现这个算法。

步骤一:分治

第一步是将原数组分割成两个子数组。我们可以使用 ArrayList 的 subList 方法实现。

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 2, 5));
List<Integer> left = list.subList(0, list.size() / 2);
List<Integer> right = list.subList(list.size() / 2, list.size());

上面的代码将原数组分割成了左右两个子数组。subList 方法返回的是一个视图,对视图的修改会影响原始数组的值。我们可以使用 new ArrayList<>(subList) 创建新的 ArrayList 对象,以避免对原数组的修改。

步骤二:排序

第二步是对子数组进行排序。我们可以使用 ArrayList 的 sort 方法实现。sort 方法的默认排序方式是升序排列。

left.sort(Comparator.naturalOrder());
right.sort(Comparator.naturalOrder());

上面的代码对左右两个子数组进行了升序排列。

步骤三:合并

第三步是将排好序的子数组合并起来。我们可以使用 ArrayList 的 addAll 方法将一个数组添加到另一个数组的末尾,并使用 Collections 的 sort 方法对合并后的数组排序。

List<Integer> mergedList = new ArrayList<>(left);
mergedList.addAll(right);
Collections.sort(mergedList);

上面的代码将左右两个子数组合并成一个数组,并使用自然排序对其进行排序。

完整代码示例

import java.util.*;

public class MergeSort {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 2, 5));
        List<Integer> left = list.subList(0, list.size() / 2);
        List<Integer> right = list.subList(list.size() / 2, list.size());

        left.sort(Comparator.naturalOrder());
        right.sort(Comparator.naturalOrder());

        List<Integer> mergedList = new ArrayList<>(left);
        mergedList.addAll(right);
        Collections.sort(mergedList);

        System.out.println(mergedList);
    }
}

注意事项

在使用 ArrayList 进行合并排序时,需要注意以下几点:

  1. ArrayList 对象不能包含 null 元素。
  2. 使用 subList 方法返回的子列表只是原始 ArrayList 的一个视图,它对原始列表的修改会反映在原始列表上。
  3. 使用 addAll 方法将一个数组添加到另一个数组的末尾时,添加的列表的元素类型必须与目标列表相同。
  4. 使用 sort 方法时,需要确保元素类型实现了 Comparable 或使用自定义的 Comparator 排序器。