我想问一个关于算法的问题:
A和B是两个有序列表。我想将它们合并到第三个列表C中,这个列表也将被订购。例如,如果A = [2,4,7]且B = [4,5,8,9,10],则C = [2,4,4,5,7,8,9,10]。我必须首先说,只要A和B有没有复制到C的项目,某个过程就会继续。我不明白的是:
i)列表A中的第一项(称为“First(A)”,其值为2)小于“First(B)”,即4.这是列表(C)中的第一项,名为“First(C)”,等于2.但是列表(C)中的第二项(称为“Second(C)”)是您比较First(B)和Second(A)时得到的值 - - 它们都具有相同的值4,因此您使用秒(A)作为秒(C)的值。但请记住,First(B)(即4)仍未被使用,因此您将First(B)与Third(A)进行比较,因此Third(C)= First(B)。我不知道如何在我的算法中使用这个概念,见下文。
ii)一旦较短列表中的所有项目(即列表A)用完,我必须简单地将较长列表的剩余项目(即列表B)插入列表(C)。我究竟如何在我的算法中包含它?
到目前为止我无可救药的算法是:
while(A and B have items NOT copied to C) {
if (First(A) < First(B)) then (Return: First(C) = First(A))
else if (First(A) > First(B)) then (Return: First(C) = First(B))
First(A) := Next(A)
First(B) := Next(B)
First(C) := Next(C)
}
答案 0 :(得分:3)
您要做的是merge
算法的merge-sort
部分。以下链接将为您提供有关如何执行此操作的深入说明。
答案 1 :(得分:2)
您只能在复制项目的列表中前进。此外,如果您在First(A)==First(B)
时忽略,则应删除第二个。这是一些代码(不是Java,但适用于您的伪代码)
while(A and B have items NOT copied to C) {
if (First(A) < First(B)) then
(
First(C) := First(A)
First(A) := Next(A)
)
else
(
First(C) := First(B))
First(B) := Next(B)
)
First(C) := Next(C)
}
答案 2 :(得分:2)
List<Integer> listA = ...
List<Integer> listB = ...
int sizeA = listA.size();
int sizeB = listB.size();
int indexA = 0;
int indexB = 0;
List<Integer> resultList = new ArrayList<> (sizeA + sizeB);
// Start going over both lists:
while (indexA < sizeA && indexB < sizeB) {
Integer elemA = listA.get(indexA);
Integer elemB = listB.get(indexA);
// Add the smaller element to the result list
if (elemA <= elemB) {
resultList.add(elemA);
++indexA;
} else {
resultList.add(elemB);
++indexB;
}
}
// Now we're finished with one of the lists
// So we just copy the remaining elements of the other list:
if (indexA == sizeA) {
for (; indexB < sizeB; ++indexB) {
resultList.add(listB.get(indexB));
}
} else {
for (; indexA < sizeA; ++indexA) {
resultList.add(listB.get(indexA));
}
}
答案 3 :(得分:1)
您有2个已排序的列表A
和B
,并希望在进入c
时合并
LOGIC
int i =0
int j = 0
int k = ( sizeof(A[])/sizeof(A[1]) ) + sizeof(B[])/sizeof(B[1]) //total number of elements
initailize C[k]
k = 0
while(A[i]!=NULL && B[j]!=NULL)
{
if ( (A[i] < B[j]) && (A[i] != NULL ))
{
C[k] = A[i]
i++
k++
}
if( B[j] < A[i] && ( B[j] != NULL) )
{
C[k] = B[j]
k++
j++
}
}
您可能需要设置一个条件来检查您是否超出列表大小i或j或k。
答案 4 :(得分:0)
所有数字类型的通用解决方案:
public static <T extends Number> T[] mergeSortedArrays (T[] A, T[] B)
{
int x = 0;
int y = 0;
int z = 0;
T[] C = new T [A.length + B.length];
for (z = 0 ; x < A.length && y < B.length ; z++)
{
if (A[x] < B[y])
C[z++] = A[x++];
else
C[z++] = B[y++];
}
while (x < A.length)
C[z++] = A[x++];
while (y < B.length)
C[z++] = B[y++];
return C;
}