求两个等长有序序列的中位数

/*现有两个等长的升序序列的序列A,B,试设计一个时间和空间都尽可能高效的算法,找出两个序列的中位数

算法的基本思想是:分别求出两个序列的中位数,即为a b,有下列三种情况
1:a=b;即a 为两个序列的中位数
2:a<b: 则中位数只能出现在a和b之间,在序列A中舍弃a之后的元素的到序列A1,在序列B中舍弃b之前的元素,得到序列B1
3:a>b:则中位数只能出现在b和a之间,在序列a中舍弃A之后的元素得到序列A1,在序列B中舍弃b之前的元素,得到B1;
在A1和B1中分别求出中位数,重复上述过程,得到俩个序列中只有一个元素,则较小者即为所求

*/

 

 

 

#include<iostream>
using namespace std;
void ZhWei(int m[],int n[],int k)
{
int s1=0,e1=k-1,s2=0,e2=k-1;//初始化初始化两个序列的上下限;
int mid1;
int mid2;
while(s1<e1&&s2<e2)
{
 mid1=(s1+e1)/2;//序列m的中位数下标
 mid2=(s2+e2)/2;//中位数n的中位数下标
 if(mid1==mid2)
 {
     cout<<m[mid1];
     return;
 }
 else if(m[mid1]<n[mid2])
 {
  s1=mid1+1;
  if((s2+e2)%2==0)
  {
   e2=mid2-1;
  }
   else e2=mid2;
 }
  else
  {
   s2=mid2+1;
   if((s1+e1)%2==0)
   {
    e1=mid1-1;
   }
    else
    {
     e1=mid1;
    }
  }
}

  if(m[s1]<n[s2])//较小者即为所求
  cout<<m[s1];
  else
  
  cout<<n[s2];
   return;
 }

 void main()
 {
  int n[100];
  int m[100];
  int k;
  cout<<"数组元素的个数"<<endl;
  cin>>k;
  for(int i=0;i<k;i++)
  {
   cin>>n[i];
  
  }
  for(int j=0;j<k;j++)
  {

 cin>>m[j];
  }
     ZhWei(m,n, k);

 }

由于每次求两个有序序列的中位数后,得到的两个子序列的长都是上溢序列的一半,因此循环共执行log2n次,时间复杂度为O(log2n),算法除简单变量外没有额外开辟存储空间 ,因此空间复杂度为O(1)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值