Java 生成升序数字列表的算法

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)”)是比

我想问一个关于算法的问题:

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)中。我该如何在我的算法中包含这一点

到目前为止,我的算法远远不够:

          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;

}