【数组】问题:两个有序数组合并为一个有序数组

要求:

  • 不使用for循环
  • 不使用API方法进行数据迁移 :
    • System.arraycopy(int[] a,…);
    • Arrays.copyOf(int[] a,…);
  import java.util.Arrays;
  /**
   * for循环实现  扩容的思想
   */
  public class TestArraysUnionAll1 {
      public static void main(String[] args) {
          int[] a1 = {2,3,5,8,9};
          int[] a2 = {2,5,7};
  
          //创建一个足够大的数组
          int[] array = new int[a1.length+a2.length];
          //先把a1中的元素赋值进去
          for (int i = 0; i < a1.length; i++) {
              array[i] = a1[i];
          }
          //再把a2的元素赋值进去,注意下标
          for (int i = a1.length; i < array.length; i++) {
              array[i] = a2[a2.length-(array.length-i)];
          }
          //排序
          Arrays.sort(array);
          //遍历
          for (int i : array) {
              System.out.print(i+"\t");
          }
      }
  }

要求:不用for循环,不用扩容API

思路 & 代码实现:

/**
 * 两个有序数组合并为一个有序数组
 * 不能用for循环--读好书---while改造
 * 不使用工具类排序--排序的原本面目--比较
 * <p>
 * 实现思路:
 * 1.创建一个能容纳两个数组的数组
 * 2.都是有序的,实现最终有序,那就两个数组的元素进行比较。
 * 3.有序的往新数组中填充
 */
public class TestArrayUnionAll2 {
    public static void main(String[] args) {
        int[] a1 = {2, 3, 5, 8, 9};
        int[] a2 = {2, 5, 7};

        int a = a1.length;
        int b = a2.length;

        int[] array = new int[a + b];

        //定义三个起始变量,分别对应数组a1、a2、array的下标初始值
        int i = 0, j = 0, x = 0;
        /**
         * 开始数据处理
         * 什么情况下填充array数组? 0=<i<a  0=<j<b
         * 什么顺序? 根据a1、a2数组,是从下到大的
         * 什么时候填充a1的元素?什么时候填充a2的元素? 根据下标确定位置比较对应元素的大小 a1元素小放a1的 a2元素小放a2的
         */
        while (i < a && j < b) {
            if (a1[i] < a2[j]) {
                array[x] = a1[i];
                x++;
                i++;
            } else {
                array[x] = a2[j];
                x++;
                j++;
            }
        }
        /**
         * 在数据迁移的过程中会出现i>a  j>b的情况,此时出现数组下标越界异常,并且超出了上述代码的权限管理范围
         * 对于此问题,一旦i>=a 则代表数组a1元素迁移完毕  一旦j>=b 则代表数组a2迁移完毕
         * 那么剩下的a2或者a1的元素直接迁移至array即可
         */

        //a1先迁移完毕,剩下的a2直接迁移就好了
        if (i >= a) {
            while (j < b) {
                array[x] = a2[j];
                x++;
                j++;
            }
        }
        //a2先迁移完毕,剩下的a1直接迁移就好了
        if (j >= b) {
            while (i < a) {
                array[x] = a1[i];
                x++;
                i++;
            }
        }

        //打印数组array
        for (int z : array) {
            System.out.print(z+"\t");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值