#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; }