【发布时间】:2011-06-21 16:11:31
【问题描述】:
我有 2 个排序数组,a1 和 a2,长度分别为 l1 和 l2。数组a2 在长度l1 的末尾有空白空间,因此它可以包含a1 的所有元素以及它自己的元素。现在,我想将a1 合并到a2 中,这样a2 将按排序顺序包含a1 和a2 的所有元素。理想情况下,这应该使用 O(1) 辅助存储空间。我有以下代码,但出了点问题:
public static int[] merge(int []a1,int a2[],int l1, int l2){
System.out.println("l1 =" +l1 + " l2=" +l2);
int es = l2-l1;
int fs = l2-es;
System.out.println("es= " +es);
System.out.println("fs = " + fs);
int j=0;
for(int i=0;i< l1;i++){
if(j<fs){
// System.out.println("i= " + i + "a1[i]=" + a1[i]);
// System.out.println("j= " + j + "a2[j]=" + a2[j]);
if(a1[i]<a2[j]){
add(a2,j,a1[i],l2);
//i++;
fs++;
}
}else{
System.out.println("***");
a2[j]=a1[i];
}
j++;
}
return a2;
}
public static void add(int []a,int p,int key,int l){
for(int i=l-1;i>p;i--){
a[i]= a[i-1];
}
a[p]= key;
}
有人对如何解决这个问题有任何想法吗?我使用以下数据来运行代码:
int a1[]= new int[]{-1,0,7,8};
int a2[]= new int[7];
a2[0]=1;
a2[1]=3;
a2[2]=9;
输出是
l1 =4 l2=7
es= 3
fs = 4
-1
0
1
3
9
0
0
【问题讨论】:
-
你能解释一下那是什么东西吗?
-
欢迎来到 Stack Overflow!您可以在代码中添加一些注释以阐明您要做什么吗?你能提供更多关于出了什么问题的细节吗?如果您让我们更深入地了解问题,那么帮助您会容易得多。
-
旁注:在 Java 中,数组知道它们自己的长度,因此您可以用
a1.length和l2类似地替换l1。 -
您的算法似乎在进行合并,方法是从前面开始工作,然后将第二个数组的元素向下移动以腾出更多空间。您是否考虑过从第二个数组的 back 开始向前面移动?您可以检查一下,如果您采用这种方法,您将永远不需要重新洗牌。
-
看起来您在每一步中都在移动任意数量的元素。这使它成为
O(n**2)操作,因此合并没有意义,l1.addAll(l2); Collections.sort(l1);会更好地为您服务。请参阅stackoverflow.com/questions/2571049/… - 编辑:我看到我忽略了您正在使用数组而不是列表。但是,它可以很容易地适应。