//返回两个有序数组合并后的第K个的数
思路:根据二分法,判断当前二数组下,k/2个位置哪个小,
小的,肯定占据了k/2个位置了,在从过滤小的k/2数据,
看剩下的数组,现在找第k-k/2个元素了(k/2个元素已将找到了)
int GetK(int* arry1,int* arry2,int len1,int len2,int k)
{
if((arry1==NULL&&arry2==NULL)||(len1+len2<k)||k<1)
{
throw new exception("invalid params");
}
if(arry2==NULL)
{
if(k<len1)
return arry1[k];
else
throw new exception("over index1");
}
if(arry2==NULL)
{
if(k<len2)
return arry2[k];
else
throw new exception("over index2");
}
int mid=k/2;
int one=0;//第一个数组的当前移动了的下标
int two=0;//第二个数组的当前移动了的下标
while(mid)
{
if(mid+one<=len1&&mid+two<=len2)//都不越界
{
if(arry1[mid+one]>arry2[mid+two])
{
two += mid;
}
else
{
one += mid;
}
k=k-mid;
mid =k/2;
}
else
{
if(mid+one>len1)//数组1越界了
{
while(mid)
{
if(one+1<=len1)
{
if(arry1[one+1]>arry2[two+mid])
{
two+=mid;
k=k-mid;
mid =k/2;
}
else
{
one+=1;
}
}
else
{
return arry2[k];
}
}
}
else if(mid+two>len2)//数组二越界了
{
while(mid)
{
if(two+1<=len2)
{
if(arry1[two+1]>arry2[one+mid])
{
one+=mid;
k=k-mid;
mid =k/2;
}
else
{
two+=1;
}
}
else
{
return arry2[k];
}
}
}
}
}
return (arry1[one+k]<arry2[two+k]?arry1[one+k]:arry2[two+k]);
}
int main(int argc,char argv)
{
int data[]={0,1,3,5,7,9,11,13};
int arry[]={0,2,4,6,8,10,12,14};
cout<<"result : "<<GetK(data,arry,7,7,0)<<endl;
}