java合并两个有序数组的算法(抛砖引玉)

前几天看见一道面试题中要将两个有序数组合并成一个新的有序数组,首先使用了嵌套循环,之后想那样效率太低,又想出了以下思路,和大家分享下,如果有更好的方法,请留言指教:

思路:
 1.新建一个数组大小为firArr和secArr之和的数组mergeArr
 2.如果fistArr的第一个元素大于等于secArr的最后一个元素,则直接对mergeArr进行元素赋值
 3.如果secArr的第一个元素大于secArr的最后一个元素,则直接对mergeArr进行元素赋值
 4.若不满足上面两种情况,则需要进行数组拆分

  1)设置数组firArr和数组secArr的索引index,初始值都为0 

  2)循环mergeArr数组

  3)如果当前firArr的索引小于firArr数组大小且secArr的索引小于secArr数组的大小,判断firArr、secArr两数组对应位置的元素大小,将值小的数组的那个值赋值给mergeArr,并向后移动一位此数组的index
  4)如果当前位置小于firArr或者secArr两数组的大小,进行相应的复制(走到这个循环中,只能表示说,有一个数组已经索引完毕了)

代码如下:

package com.hudai.platform.manager;

import java.util.Arrays;

/**
 * 算法测试 合并两个有序数组到一个数组中
 * 
 * @author WanHongLei
 * @version 创建时间:2019年2月13日 上午11:14:13 类说明
 */
public class MergeTester {

    public static void main(String[] args) throws Exception {
        int[] a = { 1, 2, 2, 3, 4, 5 };
        int[] b = { 5, 7, 9, 13 };

        System.out.println(Arrays.toString(mergeArr(a, b)));

    }

    /**
     * 思路: 1.新建一个数组大小为firArr和secArr之和的数组mergeArr
     * 2.如果fistArr的第一个元素大于等于secArr的最后一个元素,则直接对mergeArr进行元素赋值
     * 3.如果secArr的第一个元素大于secArr的最后一个元素,则直接对mergeArr进行元素赋值 
     * 4.若不满足上面两种情况,则需要进行数组拆分
     *     1)设置数组firArr和数组secArr的索引index,初始值都为0 
     *     2)循环mergeArr数组
     *     3)如果当前firArr的索引小于firArr数组大小且secArr的索引小于secArr数组的大小,判断firArr、secArr两数组对应位置的元素大小,将值小的数组的那个值赋值给mergeArr,并向后移动一位此数组的index
     *     4)如果当前位置小于firArr或者secArr两数组的大小,进行相应的复制(走到这个循环中,只能表示说,有一个数组已经索引完毕了)
     * 
     * @param firArr
     *            第一个数组
     * @param secArr
     *            第二个数组
     * @return 合并之后的数组
     */
    private static int[] mergeArr(int[] firArr, int[] secArr) {
        int firlen = firArr.length;
        int seclen = secArr.length;
        int[] mergeArr = new int[firlen + seclen];

        if (firArr[0] >= secArr[seclen - 1]) {
            for (int i = 0; i < mergeArr.length; i++) {
                if (i < seclen) {
                    mergeArr[i] = secArr[i];
                } else {
                    mergeArr[i] = firArr[i - seclen];
                }
            }
        } else if (secArr[0] >= firArr[firlen - 1]) {
            for (int i = 0; i < mergeArr.length; i++) {
                if (i < firlen) {
                    mergeArr[i] = firArr[i];
                } else {
                    mergeArr[i] = secArr[i - firlen];
                }
            }
        } else {
            int indexFir = 0, indexSec = 0;
            for (int i = 0; i < mergeArr.length; i++) {
                if(indexFir < firlen && indexSec < seclen){
                    if (firArr[indexFir] > secArr[indexSec]) {
                        mergeArr[i] = secArr[indexSec];
                        indexSec++;
                    } else if (firArr[indexFir] < secArr[indexSec]) {
                        mergeArr[i] = firArr[indexFir];
                        indexFir++;
                    }
                }else if(indexFir < firlen){
                    mergeArr[i] = firArr[indexFir];
                    indexFir++;
                }else if(indexSec < seclen){
                    mergeArr[i] = secArr[indexSec];
                    indexSec++;
                }
            }
        }

        return mergeArr;
    }

}

 

转载于:https://www.cnblogs.com/Mr-Rocker/p/10437033.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值