java 两个有序数组合并到一个有序数组(时间复杂度低)

本文介绍了一种高效合并两个有序数组的方法,通过逐个比较并选取较小元素的方式,将两个数组合并为一个新的有序数组,时间复杂度为O(n),提供了一个Java实现示例。

默认一般会采用数组先合并,在排序

时间复杂度会在o(n) -o(n*n) 之间

我想了个其他的思路 对数组1 和数组2 元素从头开始进行一次对比,小的放入结果集合,

直到两个数组的元素都加入结果集合

这样的时间复杂度 在o(n) 只要比较两个数组较短的长度的次数

代码


import java.util.ArrayList;

/**
 * 两个有序数组合并到 一个新排序数组
 * @version   
 * @author flyer 2018年12月6日下午1:20:28
 * @since 1.8
 */
class QuickSort {

    public static void main(String[] agrs) {

        int a[] = { 1, 3, 8 };
        int b[] = { 2, 6, 6, 10, 15 };
        //生产的处理结果的数组
        ArrayList<Integer> t = new ArrayList<>();
        //查看a数组里面处理到的位置
        int ak = 0;
        //查看b数组里面处理到的位置
        int bk = 0;
        //a数组里面元素是否都已经被处理
        boolean isAOk = false;
        boolean isBOk = false;
        //a ,b数组都已经处理结束
        boolean isOk = false;
        while (!isOk) {
            if (!isAOk && a[ak] <= b[bk]) {
                t.add(a[ak]);
                System.out.print(a[ak]);
                if (ak < a.length - 1)
                    ak++;
                else {
                    isAOk = true;
                    //a处理完,直接把b数组剩下的加进去即可
                    for (int tmp = bk; tmp < b.length; tmp++) {
                        t.add(b[tmp]);
                        System.out.print(b[tmp]);
                    }
                    //a,b都处理完 程序结束
                    isOk = true;
                }
            }
            else if (!isBOk && a[ak] > b[bk]) {
                t.add(b[bk]);
                System.out.print(b[bk]);
                if (bk < b.length - 1)
                    bk++;
                else {
                    isBOk = true;
                    for (int tmp = ak; tmp < a.length; tmp++) {
                        t.add(a[tmp]);
                        System.out.print(a[tmp]);
                    }
                    isOk = true;
                }
            }
        }
        System.out.println(" result:");
        for (int i = 0; i < t.size(); i++) {
            System.out.print(t.get(i) + " ");
        }
    }

}

 

Java 中,将两个有序数组合并一个数组可以通过以下几种常见的方法实现: ### 方法一:使用双指针法 双指针法是一种高效的方法,通过分别遍历两个有序数组,比较当前元素大小,将较小的元素依次放入新数组中。 ```java public class MergeSortedArrays { public static int[] merge(int[] arr1, int[] arr2) { int m = arr1.length; int n = arr2.length; int[] merged = new int[m + n]; int i = 0, j = 0, k = 0; while (i < m && j < n) { if (arr1[i] < arr2[j]) { merged[k++] = arr1[i++]; } else { merged[k++] = arr2[j++]; } } while (i < m) { merged[k++] = arr1[i++]; } while (j < n) { merged[k++] = arr2[j++]; } return merged; } public static void main(String[] args) { int[] arr1 = {1, 3, 5}; int[] arr2 = {2, 4, 6}; int[] merged = merge(arr1, arr2); for (int num : merged) { System.out.print(num + " "); } } } ``` ### 方法二:使用 Java 的 `Arrays` 类 先将两个数组合并一个新数组,然后对新数组进行排序。 ```java import java.util.Arrays; public class MergeSortedArraysUsingArrays { public static int[] merge(int[] arr1, int[] arr2) { int m = arr1.length; int n = arr2.length; int[] merged = new int[m + n]; System.arraycopy(arr1, 0, merged, 0, m); System.arraycopy(arr2, 0, merged, m, n); Arrays.sort(merged); return merged; } public static void main(String[] args) { int[] arr1 = {1, 3, 5}; int[] arr2 = {2, 4, 6}; int[] merged = merge(arr1, arr2); for (int num : merged) { System.out.print(num + " "); } } } ``` ### 复杂度分析 - **方法一(双指针法)**: - 时间复杂度:$O(m + n)$,其中 $m$ 和 $n$ 分别是两个数组的长度。 - 空间复杂度:$O(m + n)$,主要用于存储合并后的数组。 - **方法二(使用 `Arrays` 类)**: - 时间复杂度:$O((m + n) \log (m + n))$,主要是排序的时间复杂度。 - 空间复杂度:$O(m + n)$,主要用于存储合并后的数组。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值