频道栏目
首页 > 资讯 > Java > 正文

面试题之陈利人 两个数组中求第k小元素

14-01-13        来源:[db:作者]  
收藏   我要投稿

两个数组中求第k小数

真言

幸福的人生是不存在的,什么叫幸福?不完美的完美就是幸福。

引言

陈利人先生的题目很有思考性,很喜欢。

题目

给两个同样长度排好序的数组,找出第k个最小的数。

思路

思路很清晰,借鉴与折半查找,不断减小查找范围。

举个例子吧,两个数组(a and b)如下(一共16个数),看看我们是怎么减小搜索范围的,我们找出第九小的数


第九小的数肯定在两个数组的前九个里,但是每个数组就八个数,所以没有减小范围。然后找出数组a的中间数,如下


再在数组b里折半查找这个数,如下


发现不存在,则返回最靠近查找数的数,如上。然后这时候我们发现这两个数以及其前面的数一共是5个,所以第六小数肯定不在刚才那个范围里,则缩小范围


缩小后,得到的范围如下,则查找第(6-5)小数,即第一小数,这时候就特简单了。



实验

代码

test.cpp
#include
using namespace std;

// define size for array
const int size = 20;

// function declare to the problem
int Super_bisearch(int * A,const int Asize,int * B,const int Bsize,const int k);
// function declare to binary search
int Bisearch(int *d,int length,int key );

// function main
int main()
{

	int * A = new int[size];
	int * B = new int[size];
	for(int i = 0;i<> (Asize+Bsize))
	{
		cout<<"exception of input super_bisearch"< 2 &&(sa ( ca + cb - sa - sb) )
		{
			number = number - ( ca + cb - sa - sb );
			sa = ca;
			sb = cb;	
			if( ( ca + cb - sa - sb ) == 0) break;
		}
		else if( ( ca + cb - sa - sb) == number )
		{
			return A[ca]>B[cb]?A[ca]:B[cb];
		}
		else if( number < ( ca + cb - sa - sb) )
		{
			ba = ca;
			bb = cb;
		}
	}
	int * d = new int[ba-sa+1+bb-sb+1];
	int i = sa,j = sb,bit = 0;
	while(i <= ba && j <= bb)
	{
		if(A[i] d[c] )
			{
				s = c;
				if( e-s == 1 && d[s]


相关TAG标签
上一篇:uva 11269 - Setting Problems(相邻交换法)
下一篇:c# 读xml文件
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站