Java 生成升序数字列表的算法
我想问一个关于算法的问题: A和B是两个有序列表。我想将它们合并到第三个列表C中,该列表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)”)是比较第一项(B)和第二项(A)时得到的值——它们都有相同的值4,所以使用second(A)作为second(C)的值。但请记住,第一个(B)(即4)仍然没有被使用,所以您将第一个(B)与第三个(A)进行比较,因此第三个(C)=第一个(B)。我不知道如何在我的算法中使用这个概念,见下文 ii)一旦较短列表(即列表A)中的所有项目用完,我必须简单地将较长列表(即列表B)中的剩余项目插入列表(C)中。我该如何在我的算法中包含这一点 到目前为止,我的算法远远不够:Java 生成升序数字列表的算法,java,algorithm,Java,Algorithm,我想问一个关于算法的问题: A和B是两个有序列表。我想将它们合并到第三个列表C中,该列表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)”)是比
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)
}
while(A和B的项未复制到C){
如果(第一(A)<第一(B)),那么(返回:第一(C)=第一(A))
否则,如果(第一(A)>第一(B)),则(返回:第一(C)=第一(B))
第一(A):=下一(A)
第一(B):=下一(B)
第一(C):=下一(C)
}
您要做的是合并排序
算法的合并
部分。下面的链接将给你一个关于如何做的深入解释
您只能在从中复制项目的列表上向前移动。此外,当
First(A)==First(B)
时,您应该删除第二个if,因为您忽略了它。下面是一些代码(不是Java,但适合您的伪代码)
while(A和B的项未复制到C){
如果(第一(A)<第一(B)),则
(
第一(C):=第一(A)
第一(A):=下一(A)
)
其他的
(
第一(C):=第一(B))
第一(B):=下一(B)
)
第一(C):=下一(C)
}
IMHO,从索引的角度考虑问题更容易。您使用两个索引(位置指示器),每个列表一个,并对它们进行检查,直到完成两个列表:
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));
}
}
列表列表a=。。。
列表listB=。。。
int sizeA=listA.size();
int sizeB=listB.size();
int indexA=0;
int indexB=0;
列表结果列表=新数组列表(sizeA+sizeB);
//开始检查两个列表:
而(indexA 如果(elemA您有两个排序列表A
和B
,并希望在进入c
逻辑
int i=0
int j=0
int k=(sizeof(A[])/sizeof(A[1])+sizeof(B[])/sizeof(B[1])//元素总数
初始化C[k]
k=0
while(A[i]!=NULL和&B[j]!=NULL)
{
if((A[i]
您可能需要设置一个条件来检查您的i、j或k是否超出列表大小。所有数字类型的通用解决方案:
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;
}
公共静态T[]A,T[]B)
{
int x=0;
int y=0;
int z=0;
T[]C=新的T[A.长度+B.长度];
对于(z=0;x
非常简洁易懂。谢谢!好的,我知道你在做什么。花了我一些时间,但我现在明白了。谢谢,Mureinik。刚刚在维基百科上查到了什么合并排序算法。谢谢。好的,“非空数组”正是我要找的——非常感谢Ansh。
{
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++
}
}
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;
}