减治法-两个序列的中位数
2016-03-27 11:34
239 查看
问题描述:
输入:两个长度为n的有序序列A和B
输出:序列A和B的中位数
分析:
(1)求出两个序列的中位数a和b;
(2)比较a和b,有下面三种情况;
2.1 : a == b 输出a或b,算法结束;
2.2 : a < b 则中位数在a~b之间,所以舍弃A中a之前的数得到序列A1,舍弃B中b之后的数得到序列B1。
2.3 : a>b 则中位数在b~a之间,所以舍弃A中a之后的数得到序列A1,舍弃B中b之前的数得到序列B1。
注意:
在求解过程中一定要保证两个序列中的元素个数相等!!!!。避免其中某个序列先达到中有一个元素的情况。下面代码请仔细思考。
代码:
输入:两个长度为n的有序序列A和B
输出:序列A和B的中位数
分析:
(1)求出两个序列的中位数a和b;
(2)比较a和b,有下面三种情况;
2.1 : a == b 输出a或b,算法结束;
2.2 : a < b 则中位数在a~b之间,所以舍弃A中a之前的数得到序列A1,舍弃B中b之后的数得到序列B1。
2.3 : a>b 则中位数在b~a之间,所以舍弃A中a之后的数得到序列A1,舍弃B中b之前的数得到序列B1。
注意:
在求解过程中一定要保证两个序列中的元素个数相等!!!!。避免其中某个序列先达到中有一个元素的情况。下面代码请仔细思考。
if((s1+e1)%2 == 0) s1 = mid1; else s1 = mid1+1;
代码:
#include <iostream>
using namespace std;
int MidNum(int a[],int b[],int n);
int main()
{
int a[100],b[100];
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>b[i];
cout<<MidNum(a,b,n)<<endl;;
return 0;
}
int MidNum(int a[],int b[],int n)
{
int s1,e1,s2,e2,mid1,mid2;
s1=0;s2=0;e1=n-1;e2=n-1;
while(s1<e1 && s2<e2)
{
mid1 = (s1+e1)/2;
mid2 = (s2+e2)/2;
if(a[mid1] == b[mid2])
return a[mid1];
if(a[mid1] < b[mid2])
{
if((s1+e1)%2 == 0) s1 = mid1; else s1 = mid1+1;
e2 = mid2;
}
else
{
if((s2+e2)%2 == 0)
s2 = mid2;
else
s2 = mid2+1;
e1 = mid1;
}
}
if(a[s1] < b[s2])
return a[s1];
else
return b[s2];
}
相关文章推荐
- C语言实现顺序表的插入、删除、查找、遍历等基本操作
- 文章标题
- android api-level
- 数据在内存中的存储
- 项目技术团队
- 3.2-MongoDB连接和用户管理
- iOS系统键盘和自定义键盘的切换
- 3.1-MongoDB安装
- .NET AOP (六)在编译阶段PostSharp
- ado.net EF学习系列----深入理解查询延迟加载技术
- Windows下安装python问题汇总
- 5-21 Hashing (25分)
- MVC、MVP、MVVM
- 3.0-MongoDB介绍
- hdoj-1018-Big Number
- c++中使用fstream读写文件
- extract things from text files
- 迭代器模式和java集合Collection(二)HashMap和Set
- 安卓开发基础--打招呼(事件的简单处理)
- 5-19 PAT Judge (25分)