java合并两个有序的数组

2023-03-23  本文已影响0人  Bfmall

需求:
有序数组arr1和arr2,将它们合并成有序数组newArr(递增数组)。

思路:
新建一个以两个集合长度之和为长度的新数组,从两数组最左边开始比起,把小的放入新集合,并用变量标记后一位置, 每次比较都是比较的最左边未比较过的元素(通过变量),循环比较,直至其中有一个集合遍历结束,将另一个集合剩余部分加入新集合中即可.

代码实现:

/**
     * 合并两个有序数组,合并后的数组同样按照递增排序
     *
     * @param arr1
     * @param arr2
     */
    public int[] mergeTowArray(int[] arr1, int[] arr2) {
        /**
         * arr1 = {1,3,5};
         * arr2 = {3,6,9};
         */
        if (arr1 == null || arr1.length == 0) {
            return arr2;
        }
        if (arr2 == null || arr2.length == 0) {
            return arr1;
        }
        int num = arr1.length + arr2.length;
        int[] newArr = new int[num];
        int p1 = 0;//arr1的指针
        int p2 = 0;//arr2的指针
        int pTemp = 0;//newArr的指针
        /**
         * 第一次while循环之后结果newMergeArr=[1, 3, 3, 5, 0, 0]
         * 将小的一组arr1数据添加到新数组了,但是大的一组arr2还未完全添加到新数组中
         */
        while (p1 < arr1.length && p2 < arr2.length) {
            if (arr1[p1] <= arr2[p2]) {
                //如果arr1的元素小于等于arr2的元素,将arr1的元素放入newArr中,将arr1的p1指针+1
                newArr[pTemp] = arr1[p1];
                p1 ++;
            } else {
                //如果arr1的元素大于arr2的元素,将arr2的元素放入newArr中,将arr2的p2指针+1
                newArr[pTemp] = arr2[p2];
                p2 ++;
            }
            //每一轮比较之后,将pTemp指针 +1
            pTemp ++;
        }

        //将剩余元素添加到newArr数组之后
        while (p1 < arr1.length) {
                newArr[pTemp] = arr2[p1];
                pTemp ++;
                p1 ++;
        }
        //将剩余元素添加到newArr数组之后
        while (p2 < arr2.length) {
            newArr[pTemp] = arr2[p2];
            pTemp ++;
            p2 ++;
        }
        return newArr;
    }

测试代码:

int[] mergeArr1 = {1,3,5};
int[] mergeArr2 = {3,6,9};
int[] newMergeArr = mergeTowArray(mergeArr1, mergeArr2);
Log.i(TAG, "newMergeArr="+Arrays.toString(newMergeArr));

输出结果:

newMergeArr=[1, 3, 3, 5, 6, 9]
上一篇下一篇

猜你喜欢

热点阅读