两组有序数列的中位数

Posted airycode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两组有序数列的中位数相关的知识,希望对你有一定的参考价值。

两组升序排列的数组A[m]和B[n], 求他们的中位数。

注意,中位数的概念哦~相信你会百度一下的~

 

格式:

第一行输入数字m,接下来一行输入数组A[m], 第三行输入数字n,第四行输入数组B[n],接下来输出中位数。两个数组的长度都不超过1000。

注意,需要保留5位小数哦~所以,你设计函数的时候请设计成double类型哦~

 

样例输入

1
3
5
1 2 4 5 6

样例输出

3.50000


package jsk;

import java.util.Scanner;

public class Main23 {
	private static Scanner input;
	public static void main(String[] args) {
		//两组升序排列的数组A[m]和B[n],求他们的中位数
		input = new Scanner(System.in);
		int m = input.nextInt();
		int [] array1 =new int[m];
		init(array1);
		int n = input.nextInt();
		int [] array2 = new int[n];
		init(array2);
		//把这两个数组合并起来
		mearge(array1,array2);
	}
	private static void init(int [] array) {
		for (int i =0;i<array.length;i++) {
			array[i] = input.nextInt();
		}
	}
	public static void mearge(int[]array1,int[]array2){
		int p1 = array1.length-1;
		int p2 = array2.length-1;
		//循环遍历array1,array2,然后合并起来
		int newLength = array1.length+array2.length-1;
		int [] newArray = new int[newLength+1];
		while (p1 >= 0 && p2 >= 0) {//二者长度相等部分
			if (array1[p1] >= array2[p2]) {
				newArray[newLength] = array1[p1];
				p1--;
				newLength--;
			} else {
				newArray[newLength] = array2[p2];
				newLength--;
				p2--;
			}
		}
		//假设a数组多出来
		while (p1 >=0) {
			newArray[newLength] = array1[p1];
			newLength--;
			p1--;
			
		}
		//假设b数组多出来
		while (p2 >=0) {
			newArray[newLength] = array2[p2];
			newLength--;
			p2--;
		}
		//求中位数,如果这这个中位数是奇数的,直接取中间的数,如果是偶数的话取中间减一,加一两个数的平均数
		if (newArray.length%2 == 1) {
			System.out.println(newArray[newArray.length/2+1]);
		}else{
			int number1 = newArray[newArray.length/2];
			int number2 = newArray[newArray.length/2-1];
			System.out.printf("%.5f",(double)(number1+number2)/2);
		}
		
		
	}
	
}

 

以上是关于两组有序数列的中位数的主要内容,如果未能解决你的问题,请参考以下文章

有序数组寻找中位数以及寻找K大元素

算法第二章上机实践报告

ZZNUOJ_C语言1118:数列有序(完整代码)

PTA乙级 (1049 数列的片段和 (20分))

排序算法之归并排序

FJUT 奇怪的数列(线性选择算法)题解