前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两序列的中位数算法

两序列的中位数算法

作者头像
别团等shy哥发育
发布2023-02-27 10:10:42
3910
发布2023-02-27 10:10:42
举报
文章被收录于专栏:全栈开发那些事

两序列的中位数算法(两序列的中位数是含它们所有元素的升序序列的中位数)

算法的基本思想描述如下: 分别求两个升序序列A、B的中位数,设为a和b,求序列A、B的中位数过程如下: 1.若a=b,则a或b即为所求的中位数,算法结束 2.若a<b,则舍弃序列A中较小的一般,同时舍弃序列B中较大的一半,要求两次舍弃的长度相等 3.若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求两次舍弃的长度相等。 在保留的两个升序序列中,重复过程1、2、3,知道两个序列中均只含一个元素为止,较小者即为所求的中位数。 代码如下:

代码语言:javascript
复制
  #include<stdio.h>
int M_Search(int A[],int B[],int n)
{
	//分别表示序列A和B的首位数、末位数和中位数的下标
	int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;
	while(s1!=d1||s2!=d2)
	{
		m1=(s1+d1)/2;
		m2=(s2+d2)/2;
		if(A[m1]==B[m2])
		{
			return A[m1];   //满足条件1
		}
		if(A[m1]<B[m2])  //满足条件2
		{
			if((s1+d1)%2==0){//若元素个数为奇数
			    s1=m1;       //舍弃A中间点以前的部分且保留中间点
				d2=m2;       //舍弃B中间点以后的部分且保留中间点
			} 
			else           //元素个数为偶数
			{  
				s1=m1+1;   //舍弃A中间点级中间点以前的部分
				d2=m2;    //舍弃B中间点以后的部分且保留中间点
			}
		}
		else              //满足条件3
		{
			if((s2+d2)%2==0)   //元素个数为奇数
			{
				d1=m1;     //舍弃A中间点以后的部分且保留中间点
				s2=m2;      //舍弃B中间点以前的部分且保留中间点
			}
			else          //元素个数为偶数
			{
				d1=m1;     //舍弃A中间点以后的部分且保留中间点
				s2=m2+1;   //舍弃B中间点级中间点以前部分
			}
		}
	}
	return A[s1]<B[s2]?A[s1]:B[s2];
}
int main()
{
	int A[]={1,2,3,4,5,6};
	int B[]={6,7,8,9,10,11};
	int n=6;
	int middle=M_Search(A,B,n);
	printf("中位数=%d",middle);
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

算法的时间复杂度为O(logn),空间复杂度为O(1).

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 两序列的中位数算法(两序列的中位数是含它们所有元素的升序序列的中位数)
  • 算法的时间复杂度为O(logn),空间复杂度为O(1).
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档