合并两个升序数组

合并两个升序数组_第1张图片
three-pink-green-and-yellow-houses-2904142.jpg

需求:

已知两个升序的数组,合并他们,生成一个新的升序数组,不借助于其他API实现。

分析:

1、首先肯定需要定义一个新的数组空间,在已知的数组上做修改不现实,因为数组不擅长做插入和删除。
2、用原始的方法实现,也就是比较的方法,是一个笨方法,也是一个有效的办法。
3、涉及到三个数组,三个下标变量。
4、可以采用循环和递归两种方式来实现。

源码实现:

1、循环实现

    public static void main(String[] args) {
        int[] a = {1, 3, 6};
        int[] b = {2, 4, 5, 7, 9};
        int[] c = new int[a.length + b.length];
        circulate(a, b, c);
        for (int x : c) {
            System.out.println(x);
        }
    }

    public static void circulate(int[] a, int[] b, int[] c) {//循环实现
        int i = 0, j = 0, k = 0;
        while (i < a.length && j < b.length) {//两个数组都还没有遍历结束,长度短的会先遍历完,触发这个条件不满足
            if (a[i] < b[j])
                c[k++] = a[i++];
            else
                c[k++] = b[j++];
        }
        while (i < a.length) {//b数组已经遍历结束,把a数组剩余的元素迭代赋值给新数组
            c[k++] = a[i++];
        }

        while (j < b.length) {//a数组已经遍历结束,把b数组剩余的元素迭代复制给新数组
            c[k++] = b[j++];
        }
    }

2、递归实现

    static int[] a = {1, 3, 6};
    static int[] b = {2, 4, 5, 7, 9};
    static int[] c = new int[a.length + b.length];
    static int k = 0, i = 0, j = 0;

    public static void main(String[] args) {
        recursive(i, j);
        for (int x : c) {
            System.out.println(x);
        }
    }

    public static void recursive(int i, int j) {//递归实现
        if (i + j == a.length + b.length)//终止条件
            return;
        if (i < a.length && j < b.length) {
            if (a[i] < b[j])
                c[k++] = a[i++];
            else
                c[k++] = b[j++];
        } else {
            if (i < a.length)
                c[k++] = a[i++];

            if (j < b.length)
                c[k++] = b[j++];
        }

        recursive(i, j);
    }

总结:

做算法题的过程中,一定要有耐心,用笔在纸上一步一步的写着可能的解决方案。然后,根据写的思路,抽象、归纳出通用的算法。坚持做下去,收获肯定会颇丰的。

你可能感兴趣的:(合并两个升序数组)