第一道题两个有序的数组,如何找出两个数组合并后的第K大的数

#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;
}
原文地址:https://www.cnblogs.com/fickleness/p/3103922.html