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;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM