題目描述:
有兩個整數類型的數組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;
}
}
運行結果: