如何将三个有序数组合并为一个有序数组?在O(n)

时间:2019-03-26 20:56:54

标签: java arrays sorting merge

我的代码应该选择三个数组并返回三个数组的组合,这些数组可以具有不同的长度。该代码应在O(n)中进行组合。

  

示例:a [] = {1,2} b [] = {1,4,5} c [] = {2,4,5,6}

     

我的结果应该是:d [] = {1,1,2,2,4,4,5,5,6}

2 个答案:

答案 0 :(得分:2)

[在问题编辑中添加O(n)约束之前已回答。]

将所有数组添加到列表并再次排序。一个例子是:

Integer[] a = {1, 2};
Integer[] b = {1, 4, 5};
Integer[] c = {2, 4, 5, 6};

List<Integer> lists = new ArrayList<>();
lists.addAll(Arrays.asList(a));
lists.addAll(Arrays.asList(b));
lists.addAll(Arrays.asList(c));

//print
lists
  .stream()
  .sorted()
  .forEach(System.out::println);

答案 1 :(得分:2)

一种方法(我相信还有很多其他方法)将是:

根据输入数组长度的总和创建输出数组:

int[] output = new int[a.length + b.length + c.length];

为每个输入数组创建一个索引指针:

int aIndex = 0;
int bIndex = 0;
int cIndex = 0;

对输出数组中的每个位置循环一次,并用每个输入数组的当前索引处的最小值填充它(检查是否没有用完该数组):

for(int outputIndex = 0; outputIndex < output.length; outputIndex++) {
    if (aIndex < a.length
            && (bIndex >= b.length || a[aIndex] <= b[bIndex])
            && (cIndex >= c.length || a[aIndex] <= c[cIndex])) {
        output[outputIndex] = a[aIndex];
        aIndex++;
    } else if (bIndex < b.length
            && (aIndex >= a.length || b[bIndex] <= a[aIndex])
            && (cIndex >= c.length || b[bIndex] <= c[cIndex])) {
        output[outputIndex] = b[bIndex];
        bIndex++;
    } else {
        output[outputIndex] =  c[cIndex];
        cIndex++;
    }
}

编辑:这是我经过编译和测试的代码:

public class Join {

    public static void main(String[] args) {
        int[] a = {1, 2};
        int[] b = {1, 4, 5};
        int[] c = {2, 4, 5, 6};

        int[] output = new int[a.length + b.length + c.length];

        int aIndex = 0;
        int bIndex = 0;
        int cIndex = 0;

        for(int outputIndex = 0; outputIndex < output.length; outputIndex++) {
            if (aIndex < a.length
                    && (bIndex >= b.length || a[aIndex] <= b[bIndex])
                    && (cIndex >= c.length || a[aIndex] <= c[cIndex])) {
                output[outputIndex] = a[aIndex];
                aIndex++;
            } else if (bIndex < b.length
                    && (aIndex >= a.length || b[bIndex] <= a[aIndex])
                    && (cIndex >= c.length || b[bIndex] <= c[cIndex])) {
                output[outputIndex] = b[bIndex];
                bIndex++;
            } else {
                output[outputIndex] =  c[cIndex];
                cIndex++;
            }
        }
    }
}

在调试器中通过方法末尾的断点验证。