合并两个有序数组

已知:
给定两个有序数组(升序)
int[] a = {2,3,5,7,8,9};
int[] b = {0,1,2,4,6,7};
要求:
将 有序数组 a、b 合并为一个 有序数组 c。

分析:
1.首先创建一个长度等于 数组a、b之和的数组c,作为存储合并后结果的最终数组。
2.合并两个有序数组:
就是把两个有序数组的全部内容,按照既定顺序,整合排列为一个新的有序数组。
思路:
1>.借助一个for循环,以变量 index 作为循环变量,同时作为数组c的下标索引值,故for循环边界为:( index = 0 ; index <c.length ; index++)
2>.循环内容为:分别从头开始遍历有序数组a、b,由于这里是升序排列,即顺序为从小到大排列。判断有序数组a、b当前的值,哪个数组的数值小,就把当前的这个较小的数值赋值给存储结果的数组c,然后将数组c和当前已经排完序的数组(数组a或b)的下标,分别向下移动一个下标,继续同另一个数组的当前值进行比较,依旧是将较小的数值赋值给数组c,依此重复,直至循环结束,将存储结果的数组c填满(即,合并完两个有序数组a、b)。由于需要始终标记数组a,b的下标位置,所以需要引入两个初值为0的int型变量:int i = 0,j=0; 分别用于记录数组a,b的排序位置。
3>.需要注意的是,由于每排完一个数值,需要移动对应数组a或b的下标,当排完某个数组的最后一个元素后,移动下标位置+1后,以后,再以此值作为下标的数组已经造成边界溢出的运行错误,因此,每次执行循环内的内容时,首先要做的是,判断是否有数组的下标已经溢出边界,而不是先比较两个数组的当前数值大小,无边界溢出情况,则进行数组的值比较;如果存在边界溢出情况(即:有一个数组已经被全部排完),则把另一个数组剩余的全部内容,直接赋给存储结果的数组c即可。

代码实现:

public static void main(String[] args) {
        /**
         * 1.将 有序数组 a、b ,
         * 合并为一个 有序数组 c。
         */
        int[] a = {2,3,5,7,8,9};
        int[] b = {0,1,2,4,6,7};

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

        for (int  i = 0,j = 0,index = 0;index <c.length;index++){
            //如果 数组a 走完了
            if(i >= a.length){
                /**     方案 1 :            */
                c[index] = b[j++];

                /**     方案 2 :            */
//                while (index <c.length){
//                    c[index] = b[j++];
//                    index++;
//                }

            }
            //如果 数组b 走完了
            else if(j >= b.length){
                /**     方案 1 :            */
                c[index] = a[i++];

                /**     方案 2 :            */
//                while (index <c.length){
//                    c[index] = a[i++];
//                    index++;
//                }
            }
            else if(a[i] <= b[j] ){
                c[index] = a[i++];
            }
            else{
                c[index] = b[j++];
            }

        }


        //用 增强for 输出。
        for (int n : c){
            System.out.println(n);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值