题目描述:
有两个整数类型的数组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;
}
}
运行结果: