首页 > 代码库 > 两个有序数组的第n大数

两个有序数组的第n大数

两个有序数组,各自含有n个元素,求第n大的元素

1.顺序遍历两个数组,计数变量k统计出现的第k小元素,时间复杂度为O(n)

代码如下:

int getmid(int a[],int b[],int n)
{
	int k=0;
	int i=0,j=0;
	while(i<n&&j<n)
	{
		if(a[i]<b[j])
		{
			i++;
			k++;
			if(k==n)
				return a[i-1];
		}
		else 
		{
			j++;
			k++;
			if(k==n)
				return b[j-1];
		}
	}
}

2.二分的方法

    取A数组的中间元素mid1,取B数组的中间元素mid2,先比较这两个元素的大小,如果这两个元素相等,则直接返回A[mid1],如果A[mid1]<B[mid2],则mid1左侧的元素可以去掉,B数组右侧的元素可以去掉,这里还要区分数组元素个数为偶数奇数的情况,如果元素个数为偶数,则mid1元素也要去掉。如果A[mid1]<B[mid2]的情况与此类似。时间复杂度为O(logn)

# include <iostream>
# include <cstdlib>
using namespace std;

int mid(int a[],int b[],int n)
{
	int s1=0,e1=n-1;
	int s2=0,e2=n-1;
	int mid1=(s1+e1)/2;
	int mid2=(s2+e2)/2;
	while(s1!=e1||s2!=e2)
	{
		mid1=(s1+e1)/2;
		mid2=(s2+e2)/2;
		if(a[mid1]==b[mid2])
		{
			return a[mid1];
		}
		if(a[mid1]<b[mid2])
		{
			if((s1+e1)%2==0)
			{
				s1=mid1;
				e2=mid2;
			}
			else 
			{
				s1=mid1+1;
				e2=mid2;
			}
		}
		else
		{
			if((s1+e1)%2==0)
			{
				e1=mid1;
				s2=mid2;
			}
			else
			{
				e1=mid1;
				s2=mid2+1;
			}
		}
	}
	return a[s1]<b[s2]?a[s1]:b[s2];
}

int main()
{
	int a[5]={2,4,5,6,9};
	int b[5]={1,3,7,8,10};
	cout<<mid(a,b,5)<<endl;
	system("pause");
	return 0;
}

两个有序数组的第n大数