【问题标题】:Collections vs Arrays regarding sort()关于 sort() 的集合与数组
【发布时间】:2011-07-09 15:38:06
【问题描述】:

关于 sort() 的集合与数组 关于 sort() 方法,这两者有什么区别?我知道 Arrays 的 sort() 正在对 sort() 使用二进制搜索,那么 Collections 呢?以及如何选择使用哪个? 谢谢!

【问题讨论】:

  • 二分查找不是排序算法。

标签: java


【解决方案1】:

Arrays.sort() 对数组进行排序,即位于连续内存位置的对象。它适用于数组输入。

Collections.sort() 可以对连续和离散内存位置上的对象进行排序:即它可以在ArrayListLinkedList 上工作。 Collections.sort() 在内部将 List 转换为对象的 Array 并调用 Arrays.sort() 对它们进行排序。它总是创建原始列表对象的额外副本。对于ArrayList 作为输入,它会创建额外的副本以保持原始数组的可变性。对于 LinkedList 作为输入,会创建一个新数组以提高性能。

【讨论】:

  • '它总是创建原始列表对象的额外副本':不,它没有。它会创建一个新数组,但不会复制对象。
【解决方案2】:

类数组

public static void sort(T[] a)

参数:
a - 要排序的数组

实施说明(截断):

  1. 双轴快速排序并在许多数据集上提供 O(n log(n)) 性能。
  2. 比传统(单轴)快速排序实现更快。

类集合

公共静态 > void sort(List list)

参数:
list - 要排序的列表。

实施说明(截断):

  1. 是一种合并排序,当输入数组部分排序时,它需要远少于 n 次 lg(n) 比较,同时在输入数组随机排序时提供传统合并排序的性能。
  2. 如果输入数组接近排序,则实现需要大约 n 次比较。
  3. 临时存储要求各不相同,从几乎排序的输入数组的小常数到随机排序的输入数组的 n/2 对象引用。

求和

  1. 它们基于不同类型的数据,一种在 Array 中,另一种在 List 中。
  2. 关于时间复杂度,取决于数据是部分排序的还是随机排序的
  3. 涉及空间时,Arrays.sort 需要恒定时间,但 Collections.sort 最多可能占用 n/2 空间。

【讨论】:

    【解决方案3】:

    Collection.sort 用于处理列表,arrays.sort 用于处理数组。但内部 Collection.sort 仅使用 Arrays.sort 方法。 现在内部排序是基于 Timosrt 技术而不是合并排序完成的,因为稳定的自适应数组在合并排序中进行 O(nlogn) 比较,但在 Timsort 最坏的情况下它将花费 O(nlogn) 并且在最坏的情况下存储需要 n/2 Timsort 但它不是在合并排序技术的情况下。

    【讨论】:

      【解决方案4】:

      我知道 Arrays 的 sort() 使用的是二进制 搜索排序()

      不,你不知道这样的事情。它不这样做。请参阅 Javadoc。

      这句话甚至没有意义。您不能“使用二进制搜索进行排序”。仅当数据已经排序时,二进制搜索才有效。也许您读到的是Arrays.binarySearch() 假设数据已排序。

      【讨论】:

        【解决方案5】:

        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);
        

        【讨论】:

          【解决方案6】:

          正如其他答案所说,您将在处理实现 Collection 接口的对象时使用 Collections.sort(),在处理数组时使用 Arrays.sort() 方法。

          一个相关的问题是,如果您想对一组值进行排序,哪种类型的数据结构更好。如果您需要使用 List,那么我建议您使用 LinkedList,因为插入运行在 O(1) 中,而 ArrayList 之类的东西将是 O(n)。

          如果没有重复项或不需要重复项,您也可以选择使用 SortedSet。这样您就不必费心使用外部排序方法。

          【讨论】:

          • 如果你在排序,一个数组比一个链表更胜一筹,并且声称'一个 ArrayList 将是 O(n);是假的。
          【解决方案7】:

          好吧,除了操作不同的东西(Collections.sort 操作 ListArrays.sort 操作数组)之外,java.util.Collections.sort() 只需调用 java.util.Arrays.sort() 来完成繁重的工作。

          另外,请注意Arrays.sort 运行合并排序。

          【讨论】:

          • 原始数组的排序使用快速排序,但是(因为对于原始数组而言,稳定性属性既不需要也没有意义)。
          • 看起来像是 java 7 中的 timsort(修改后的合并排序)stackoverflow.com/questions/4018332/…
          【解决方案8】:

          如果您正在处理一个数组,请使用 Arrays.sort()。如果您正在处理实现 Collection 接口的东西(例如 ArrayList),请使用 Collections.sort()。

          【讨论】:

            猜你喜欢
            • 2013-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-09
            • 2013-05-11
            • 2018-02-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多