【问题标题】:How do I sort two ArrayList, while merging into one?如何对两个 ArrayList 进行排序,同时合并为一个?
【发布时间】:2018-08-02 08:29:44
【问题描述】:

我有两个ArrayList,例如:

ArrayList a = new ArrayList();
    a.add(10);
    a.add(35);
    a.add(51);

ArrayList b = new ArrayList();
    b.add(24);
    b.add(46);
    b.add(81);

我需要创建一个函数,将 B 到 A 的元素放入排序查询中。 (在我看来,它必须检查 A 和 B 中相同位置的元素,并将 24 放在 10 和 35 之间,将 46 放在 35 和 51 之间,最后一个是 81)。 我有:

 public static void merge(ArrayList a, ArrayList b)
 {
     a.addAll(b);
     Collections.sort(a);
 }

但它不是一个有效的算法(N^2)。 有没有更高效的?

【问题讨论】:

  • 列表是否已排序?
  • 怎么说是O(n^2)?
  • 我会使用 LinkedLists 按索引更好地对您的值进行排序
  • 另外,不要使用原始类型..为类型提供类型参数
  • 作为一个新手,你如何关心排序算法的有效性? :-) 只要您的数组不包含数千个元素,无论如何排序都会立即进行。

标签: java sorting arraylist


【解决方案1】:

来自List.sort的文档

这个实现是一个稳定的、自适应的、迭代的归并排序,它 当输入数组为 部分排序,同时提供传统的性能 输入数组随机排序时的归并排序。如果输入数组 接近排序,实现需要大约 n 比较。临时存储要求从一个小的常数变化 对于几乎排序的输入数组到 n/2 对象引用随机 有序输入数组。

这个实现的复杂度是 O(n lg(n))。大多数时候甚至更低,尤其是在输入几乎已排序的情况下。 Java 版本之间的复杂性可能会有所不同,但 O(n lg(n)) 相当可靠。

回到你的算法,我们可以这么说

a.addAll(b); // requires O(n)
Collections.sort(a); // requires O(n lg(n))

所以它永远不会比 O(n lg(n)) 更糟。

【讨论】:

    【解决方案2】:

    正如你所说,这两个列表是排序的,那么有一个 O(N) 的方式来合并这两个列表。

    static List<Integer> merge(List<Integer> a, List<Integer> b) {
        List<Integer> merged = new ArrayList<>(a.size() + b.size());
        int ai = 0, bi = 0;
        while (ai < a.size() && bi < b.size()) {
            if (a.get(ai) < b.get(bi))
                merged.add(a.get(ai++));
            else
                merged.add(b.get(bi++));
        }
        while (ai < a.size())
            merged.add(a.get(ai++));
        while (bi < b.size())
            merged.add(b.get(bi++));
        return merged;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多