欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

找到两个排序数组的中位数

程序员文章站 2022-04-25 14:31:02
...
//找到两个排序数组的中位数
public class GetMedianTwoArr{
	//k为中位数的位置
 public static  double findKth(int a[], int m, int b[], int n, int k)
{
	//always assume that m is equal or smaller than n
	if (m > n)
		return findKth(b, n, a, m, k);
	if (m == 0)
		return b[k - 1];
	if (k == 1)
		return Math.min(a[0], b[0]);
	//divide k into two parts
	int pa = Math.min(k / 2, m), pb = k - pa;
	if (a[pa - 1] < b[pb - 1])
	{
		  int[]str=new int[a.length-pa+1];
		  for(int i=pa;i<a.length;i++)
		  {
		  	     str[i-pa]=a[i];
		  }
		return findKth(str, m - pa, b, n, k - pa);
	}

	else if (a[pa - 1] > b[pb - 1])
	{
		 int[]str2=new int[b.length-pb+1];
		  for(int i=pb;i<b.length;i++)
		  {
		  	     str2[i-pb]=b[i];
		  }

		return findKth(a, m, str2, n - pb, k - pb);
	}
	else
		return a[pa - 1];
}


public static double findMedianSortedArrays(int A[], int m, int B[], int n)
{
		int total = m + n;
		//若为奇数
		if ((total&1)>0)
			return findKth(A, m, B, n, total / 2 + 1);
		//若为偶数
		else
			return (findKth(A, m, B, n, total / 2)
				 + findKth(A, m, B, n, total / 2 + 1)) / 2;
}

  public static void main(String[]args)
  {
         int[]A={1,2,3};
         int[]B={3,4};
         int m=A.length;
         int n=B.length;
         System.out.println(findMedianSortedArrays(A,m,B,n));

  }
}
找到两个排序数组的中位数