面试题分享:将两个数组合并并且排序

题目描述:

有两个整数类型的数组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;
    }
}

运行结果:
在这里插入图片描述

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