数据结构 java 合并两个排序好的数组

给定两个排序数组,任务是以排序方式合并它们。
例子: 

输入: arr1[] = { 1, 3, 4, 5}, arr2[] = {2, 4, 6, 8} 输出: arr3[] = {1, 2, 3, 4, 4, 5, 6, 8}

输入: arr1[] = { 5, 8, 9}, arr2[] = {4, 7, 8} 输出: arr3[] = {4, 5, 7, 8, 8, 9}

方法1:暴力解法,将两个数组合成一个数组,在对其进行排序

时间复杂度 : O((m+n) log(m+n)),arr3 的整个大小为 m+n
辅助空间:O(1),不使用多余的空间

import java.util.Arrays;


public class _test {
    public static void main(String[] args) {
        int arr1[] = {1, 3, 5, 7};
        int n1 = arr1.length;

        int arr2[] = {2, 4, 6, 8};
        int n2 = arr2.length;

        //创建一个新数组存放前面两个数组(也可以对arr1后面直接追加arr2)
        int arr3[] = new int[n1 + n2];
        mergeArrays(arr1, arr2, n1, n2, arr3);

        System.out.println("Array after merging");
        for (int i=0; i < n1+n2; i++)
            System.out.print(arr3[i] + " ");

    }

    public static void mergeArrays(int[] arr1, int[] arr2, int n1, int n2, int[] arr3){
        int i = 0;
        int j = 0;
        int k = 0;

//        先把arr1加入arr3中
        while(i < n1){
            arr3[k++] = arr1[i++];
        }

//       再把arr2加入arr3中
        while(j < n2){
            arr3[k++] = arr2[j++];
        }

//      对新数组arr3进行排序
        Arrays.sort(arr3);
    }
}



 

 方法2:

取两个排序数组 Ar(O(n1 + n2) 时间和 O(n1 + n2) 额外空间ray1 和 Array2 和一个空数组 3 。以三个指针 'i'、'j' 和 'k' 进行比较,这里的 'i' 指针指向 Array0 的第 1 个索引,类似地,“j” 和 'k' 指针指向 Array0 和 Array2 的第 3 个索引

初始数组

第 1 步: 选择较小的元素,即 4 并插入到 Array3 中,并在比较“i”和“j”后更新指针“j”和“k”。

选择较小的元素,即 4 

第 2 步: 选择下一个较小的元素,即 5 并插入到 Array3 中,并在比较“i”和“j”后更新指针 'i' 和 'k'

选择下一个较小的元素,即 5

第 3 步: 选择下一个较小的元素,即 7 并插入到 Array3 中,并在比较“i”和“j”后更新指针“j”和“k”。

 选择下一个较小的元素,即 7

第 4 步:“j”指针遇到 Array2 的长度时,首先是循环中断,其次是循环将所有元素从 arr1 复制到 arr3。

第二个 while 循环将所有元素从 arr1 复制到 arr3

第 5 步: 从 Array1 中选取相邻元素并插入到 Array3 中并更新指针 i 和 k

  从数组 1 中选取相邻元素并插入到数组 3 中 

第 6 步: 从 Array1 中选取剩余元素并插入到 Array3 中,当 i 指针遇到 Array1 的长度时,这意味着 k = n1+n2,最后我们合并了排序的 Array3

从数组 中剩余元素并插入到 Array3 中,



public class _test {

    public static void mergeArrays(int[] arr1, int[] arr2, int n1,
                                   int n2, int[] arr3)
    {
        int i = 0, j = 0, k = 0;

        // 在两个数组中都有元素的情况下
        while (i<n1 && j <n2)
        {
//          判断数组1和数组2中哪个元素下,小的元素插入到数组3中
            if (arr1[i] < arr2[j])
                arr3[k++] = arr1[i++];
            else
                arr3[k++] = arr2[j++];
        }

        // 当其中一个数组遍历完成之后,将剩余数组的元素插入到数组3中
        while (i < n1)
            arr3[k++] = arr1[i++];
        while (j < n2)
            arr3[k++] = arr2[j++];
    }

    public static void main (String[] args)
    {
        int[] arr1 = {1, 3, 5, 7};
        int n1 = arr1.length;

        int[] arr2 = {2, 4, 6, 8};
        int n2 = arr2.length;

        int[] arr3 = new int[n1+n2];

        mergeArrays(arr1, arr2, n1, n2, arr3);

        System.out.println("Array after merging");
        for (int i=0; i < n1+n2; i++)
            System.out.print(arr3[i] + " ");
    }
}



 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值