Java 合并为一个ArrayList时,如何对两个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 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))