【发布时间】:2011-07-09 15:38:06
【问题描述】:
关于 sort() 的集合与数组 关于 sort() 方法,这两者有什么区别?我知道 Arrays 的 sort() 正在对 sort() 使用二进制搜索,那么 Collections 呢?以及如何选择使用哪个? 谢谢!
【问题讨论】:
-
二分查找不是排序算法。
标签: java
关于 sort() 的集合与数组 关于 sort() 方法,这两者有什么区别?我知道 Arrays 的 sort() 正在对 sort() 使用二进制搜索,那么 Collections 呢?以及如何选择使用哪个? 谢谢!
【问题讨论】:
标签: java
Arrays.sort() 对数组进行排序,即位于连续内存位置的对象。它适用于数组输入。
Collections.sort() 可以对连续和离散内存位置上的对象进行排序:即它可以在ArrayList 和LinkedList 上工作。 Collections.sort() 在内部将 List 转换为对象的 Array 并调用 Arrays.sort() 对它们进行排序。它总是创建原始列表对象的额外副本。对于ArrayList 作为输入,它会创建额外的副本以保持原始数组的可变性。对于 LinkedList 作为输入,会创建一个新数组以提高性能。
【讨论】:
public static void sort(T[] a)
参数:
a - 要排序的数组
实施说明(截断):
公共静态
参数:
list - 要排序的列表。
实施说明(截断):
【讨论】:
Collection.sort 用于处理列表,arrays.sort 用于处理数组。但内部 Collection.sort 仅使用 Arrays.sort 方法。 现在内部排序是基于 Timosrt 技术而不是合并排序完成的,因为稳定的自适应数组在合并排序中进行 O(nlogn) 比较,但在 Timsort 最坏的情况下它将花费 O(nlogn) 并且在最坏的情况下存储需要 n/2 Timsort 但它不是在合并排序技术的情况下。
【讨论】:
我知道 Arrays 的 sort() 使用的是二进制 搜索排序()
不,你不知道这样的事情。它不这样做。请参阅 Javadoc。
这句话甚至没有意义。您不能“使用二进制搜索进行排序”。仅当数据已经排序时,二进制搜索才有效。也许您读到的是Arrays.binarySearch() 假设数据已排序。
【讨论】:
Collections.sort() 对列表进行操作,而 Arrays.sort() 对数组进行操作。
Arrays.sort() 使用 Dual-Pivot Quicksort 对原始数组和 MergeSort 对对象数组进行排序。
Collections.sort() 示例:
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(15);
arr.add(10);
arr.add(5);
arr.add(2);
Collections.sort(arr);
Arrays.sort() 示例:
int[] arr = new int[4]
arr[0]=15;
arr[1]=10;
arr[2]=5;
arr[3]=2;
Arrays.sort(arr);
【讨论】:
正如其他答案所说,您将在处理实现 Collection 接口的对象时使用 Collections.sort(),在处理数组时使用 Arrays.sort() 方法。
一个相关的问题是,如果您想对一组值进行排序,哪种类型的数据结构更好。如果您需要使用 List,那么我建议您使用 LinkedList,因为插入运行在 O(1) 中,而 ArrayList 之类的东西将是 O(n)。
如果没有重复项或不需要重复项,您也可以选择使用 SortedSet。这样您就不必费心使用外部排序方法。
【讨论】:
好吧,除了操作不同的东西(Collections.sort 操作 List,Arrays.sort 操作数组)之外,java.util.Collections.sort() 只需调用 java.util.Arrays.sort() 来完成繁重的工作。
另外,请注意Arrays.sort 运行合并排序。
【讨论】:
如果您正在处理一个数组,请使用 Arrays.sort()。如果您正在处理实现 Collection 接口的东西(例如 ArrayList),请使用 Collections.sort()。
【讨论】: