#include <cstdlib>
#include <iostream>
#include<algorithm>
using namespace std;
//28/05/13 16:36
//如果使用临时数组的话复杂度会减少很多。。。
//搞了两个小时终于搞定了
//关键在于
//1、如何判定那个指针移动
//2、数组b遇到最后一个元素时怎么办
//3、数组a遇到最后一个元素怎么办
//4、设定a的最大值比b的最大值大,就是为了是q指针先打到末尾,要不然很混乱
int main(int argc, char *argv[])
{
//初始化数组
int a[]={1,2,3,4,8,9,13};
int b[]={2,2,6,7,12};
//计算数组长度
const int lena=sizeof(a)/sizeof(a[0]);
const int lenb=sizeof(b)/sizeof(b[0]);
//计算数组的最大值
const int maxa=a[lena-1];
const int maxb=b[lenb-1];
//pq指针分别指向数组的首元素
int *p=a;
int *q=b;
//设定计数器 ,使用静态值较好
static int count =0;
//
int k;
cout<<"请输入第k大的k值:";
cin>>k;
if(k<1||k>lena+lenb)
{
cout<<"输入数据不符合要求,请重新输入,亲!"<<endl;
cout<<"请输入第k大的k值:";
cin>>k;
}
//只考虑 当a数组最大元素大于b数组最大元素时 ,另外一种情况类推
if(maxa>maxb)
{
//循环结束的条件 ,都已到达数组的结尾
while(p<=a+lena-1 && q<=b+lenb-1 )
{
//a的元素小于b的元素时
if(*p<=*q)
{
//先计数器加一
++count;
//如果满足k值输出此时a数组中的元素,跳出整个循环,不满足时语句不执行
if(k==count)
{cout<<"第"<<k<<"个数是="<<*p<<endl;
break;
}
//不是要找的元素时,往下走
p++;
}
//&& p!=a+lena-1
/* if(*p<=*q && p==a+lena-1)
{ ++count;
if(k==count)
{cout<<"第"<<k<<"个数是="<<*p<<endl;
break;
}
}
*/
//当a中元素大于b中元素时,q指针往后走,q不能是倒数第一个元素
if(*p>*q&& q!=b+lenb-1 )
{
++count;
if(k==count )
{cout<<"第"<<k<<"个数是="<<*q<<endl;
break;
}
q++;
}
//&& q!=b+(sizeof(b)/sizeof(b[0]))-1
//q是数组中的 最后一个元素,q指针不变,p指针往后走
//此时q已是b中的最后一个元素
//b+lenb是哨兵
//b+lenb-1是最后一个元素
if(*p>*q && q==b+lenb-1)
{
//b中最后一个 元素命中时跳出
++count;
if(k==count )
{cout<<"第"<<k<<"个数是="<<*q<<endl;
break;
}
//没有命中,就要返回a中继续找
//当p不是A中的最后一个元素时,往下走
while(p<a+lena-1)
{
++count;
if(k==count )
{cout<<"第"<<k<<"个数是="<<*p<<endl;
break;
}
p++;
}
//当p是a中最后一个元素时,指针不再往下走
if(p=a+lena-1)
{
++count;
if(k==count )
{cout<<"第"<<k<<"个数是="<<*p<<endl;
break;
}
}
}
}
}
system("PAUSE");
return EXIT_SUCCESS;
}