生成升序列表的算法

时间:2014-01-23 06:34:37

标签: java algorithm

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

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)
             }

5 个答案:

答案 0 :(得分:3)

您要做的是merge算法的merge-sort部分。以下链接将为您提供有关如何执行此操作的深入说明。

Wikipedia
Princeton Edu
Colorado Edu

答案 1 :(得分:2)

您只能在复制项目的列表中前进。此外,如果您在First(A)==First(B)时忽略,则应删除第二个。这是一些代码(不是J​​ava,但适用于您的伪代码)

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个已排序的列表AB,并希望在进入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;

}