有两个有序的数据,将他们合并并保持排序顺序不变

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sessionsong/article/details/79665835

有两个有序的数据 a[],b[], 他们都是升序的,将他们合并成数据c[] ,要求也是升序的
要求时间复杂度是 O(n)
请考虑边界条件,避免程序出现异常

package xyz.songxl;

public class mergeArray {
    public static void main(String[] args) {

        int a[] ={1,3,5,7,7,10};
        int b[] ={-2,2 ,100};
        int c[] = merge(a,b);
        for (int i = 0; i < c.length; i++) {
            System.out.print(c[i]+"\t");
        }
    }

    /**
     * <p>有两个有序的数据 a,b 现在要将他们合并成数组c,要求也是升序的
     * 要求时间复杂度是 O(n)
     * 请考虑边界条件,避免程序出现异常
     * </p>
     * @param a
     * @param b
     * @return
     */
    public static int[] merge(int a[], int b[]) {
        int ia = 0,ib = 0,ic=0; // 各数组的下标
        int maxa = a.length; // 个数组的最大长度
        int maxb = b.length;
        int maxc = maxa + maxb;
        int c[] = new int[maxc];

        for ( ; ic < maxc; ic++) {
            if (ia<maxa && ib<maxb) { // 两个数组中都还有元素  比较大小 把小的数据放到数组c
                if (a[ia]<= b[ib]) {
                    c[ic] = a[ia];
                    ia++;
                }else {
                    c[ic] = b[ib];
                    ib++;
                }
            }else if (ia<maxa && ib>=maxb) { // a数组中还有数据,b 数据没有了的情况  将a中剩下的数据拷贝到数组c
                for ( ; ia < maxa; ia ++,ic++) {
                    c[ic] = a[ia];
                }
//              或者直接使用数据拷贝函数 arraycopy 实现数据复制的功能
//              System.arraycopy(a, ia, c, ic, maxa-ia);
            }else if (ia>=maxa && ib<maxb) {// b 数组中还有数据,a 数据没有了的情况   将b中剩下的数据拷贝到数组c
                for ( ; ib < maxb; ib ++,ic++) {
                    c[ic] = b[ib];
                }
//              System.arraycopy(b, ib, c, ic, maxb-ib);
            }

        }

        return c;
    }
}

猜你喜欢

转载自blog.csdn.net/sessionsong/article/details/79665835