Day42:求中位数

184 阅读3分钟

day42-求中位数

【2011年真题】

一个长度为L(L≥1)的升序序列S,处在第L/2(取整)个位置的数称为S的中位数。例如,若序列S仁=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数

题源:2011年计算机考研408数组结构真题

1、思路

1.先创建一个辅助数组,长度为两数组之和;

2.定义两个变量作为两个数组的下标;

3.防止数组越界:如果i或j越界,则把i--,并且把数组最后一个元素设为最大值,这样既避免了越界,也避免了把最后一个数组重复赋值到辅助数组上去;

4.利用for循环,index值表示辅助数组的下标,如果数组第一个数组的值小,则把第一个数组的值赋值到辅助数组上去,并且把下标自增,如果第二个数组的值小,则把第二个数组的值赋值到辅助数组上去,也把下标自增;

5.求得的辅助数组已经按照顺序排序,返回temp[arr1.length - 1]就是所求的中位数;

2、具体实现

public static int f(int[] arr1,int[] arr2){

//定义两个变量作为两个数组的下标;
    int j = 0;
    int i = 0;
    
//先创建一个辅助数组,长度为两数组之和;
    int temp[] = new int[arr1.length + arr2.length];
    
//利用for循环,index值表示辅助数组的下标,如果数组第一个数组的值小,则把第一个数组的值赋值到辅助数组上去
//并且把下标自增,如果第二个数组的值小,则把第二个数组的值赋值到辅助数组上去,也把下标自增;  

    for (int index = 0; index < temp.length;index++){
    
//防止数组越界:如果i或j越界,则把i--,并且把数组最后一个元素设为最大值,
//这样既避免了越界,也避免了把最后一个数组重复赋值到辅助数组上去;   

        if (i == arr1.length)
        {
            i--;
            arr1[i] = Integer.MAX_VALUE;
        }
        if (j == arr2.length){
            j--;
            arr2[j] = Integer.MAX_VALUE;
        }
//如果数组第一个数组的值小,则把第一个数组的值赋值到辅助数组上去
//并且把下标自增,如果第二个数组的值小,则把第二个数组的值赋值到辅助数组上去,也把下标自增;        
        temp[index] = arr1[i] <= arr2[j] ? arr1[i++] : arr2[j++];
    }
//求得的辅助数组已经按照顺序排序,返回temp[arr1.length - 1]就是所求的中位数;    
    return temp[arr1.length - 1];
}

时间复杂度:O(n); 空间复杂度:O(n);