Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并为一个ArrayList时,如何对两个ArrayList进行排序?_Java_Sorting_Arraylist - Fatal编程技术网

Java 合并为一个ArrayList时,如何对两个ArrayList进行排序?

Java 合并为一个ArrayList时,如何对两个ArrayList进行排序?,java,sorting,arraylist,Java,Sorting,Arraylist,我有两个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之间,最后一

我有两个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)。 我有:

但它不是一个有效的算法(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;
}
静态列表合并(列表a、列表b){
列表合并=新数组列表(a.size()+b.size());
int ai=0,bi=0;
而(ai
来自

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

这个实现的复杂性是O(nlg(n))。大多数情况下甚至更低,尤其是当输入几乎已排序时。Java版本之间的复杂性可能会发生变化,但O(nlg(n))是非常可靠的

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

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

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

列表排序了吗?你怎么说它是O(n^2)?我会使用LinkedList按索引对值进行更好的排序。所以,不要使用原始类型。。为typeHow提供一个类型参数,作为新手,您是否关心排序算法的有效性?:-)只要您的数组不包含数千个元素,排序无论如何都是即时的。
a.addAll(b); // requires O(n)
Collections.sort(a); // requires O(n lg(n))