1. 程式人生 > >java 兩個有序數組合併到一個有序陣列(時間複雜度低)

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) + " ");
        }
    }

}