面試題分享:將兩個數組合並並且排序

題目描述:

有兩個整數類型的數組A和數組B,並且它們都是有序的,將這兩個數組合併爲一個有序數組,並分析當兩個數組長度都爲10時進行比較的最多和最少次數且它們的數據分佈情況如何?

解題思路:

創建一個長度爲兩個數組長度之和的臨時數組,在一個循環中依次比較數組A和數組B中元素的大小,將小的放入臨時數組。注意:這個比較過程需要三個變量i、j、k;i代表臨時數組下一個需要放入元素的位置,j代表數組A中還未放入臨時數組中元素的第一個,k代表數組B中還未放入臨時數組中元素的第一個,具體可參見代碼。

最壞情況: 數組A中的最後一個元素比數組B中最後一個元素小且比數組B中倒數第二個元素大,此時需要比較20次。
最好情況: 數組A中的最後一個元素比數組B中的第一個元素小,此時需要比較10次。

實現代碼:

public class MergeOrderedArray {

    private static Integer CAPACITYA = 10;
    private static Integer[] arrayA =  new Integer[CAPACITYA];
    private static Integer[] arrayB = new  Integer[CAPACITYA];

    public static void main(String[] args) {
        Random random = new Random();
        for(int i=0; i<CAPACITYA; i++) {
            arrayA[i] = random.nextInt(100);
            arrayB[i] = random.nextInt(100);
        }
        Arrays.sort(arrayA);
        Arrays.sort(arrayB);
        System.out.println(Arrays.toString(arrayA));
        System.out.println(Arrays.toString(arrayB));
        Integer[] result = merge(arrayA, arrayB);
        System.out.println(Arrays.toString(result));
    }

    public static Integer[] merge(Integer[] arrayA, Integer[] arrayB) {
        int length = arrayA.length + arrayB.length;
        Integer[] temp = new Integer[length];
        for(int i=0,j=0,k=0; i<length; i++) {
            if(j >= arrayA.length) {
                temp[i] = arrayB[k];
                k++;
                continue;
            }
            if(k >= arrayB.length) {
                temp[i] = arrayA[j];
                j++;
                continue;
            }
            if(j < arrayA.length && arrayA[j] <= arrayB[k]) {
                temp[i] = arrayA[j];
                j++;
            }else {
                temp[i] = arrayB[k];
                k++;
            }
        }
        return temp;
    }
}

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章