减治法-两个序列的中位数
来源:互联网 发布:matlab solve 数组 编辑:程序博客网 时间:2024/06/06 05:04
问题描述:
输入:两个长度为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];}
1 0
- 减治法-两个序列的中位数
- 两个有序序列的中位数
- 两个有序序列的中位数
- 求两个升序序列的中位数
- pat 两个有序序列的中位数
- PAT 两个有序序列的中位数
- 【C】两个有序序列的中位数
- PTA5-53 两个有序序列的中位数
- 两个有序序列的中位数(详解)
- 求两个等长升序序列的中位数
- 求两个等长升序序列的中位数
- 求两个等长升序序列的中位数 .
- 求两个等长升序序列的中位数
- 求两个等长有序序列的中位数
- PAT DS 2-13两个有序序列的中位数
- 2-13. 两个有序序列的中位数(25)
- PAT1019. 两个有序序列的中位数(25)
- 2-13. 两个有序序列的中位数(25)
- .Net AOP(五) 各种IoC框架下实现AOP
- 文章标题
- android api-level
- leetcode 32. Longest Valid Parentheses
- Java实现二叉树
- 减治法-两个序列的中位数
- 5-24 地下迷宫探索 (30分)
- CCF-画图,用深搜与广搜解决填充问题
- hdoj-2045-不容易系列之(3)―― LELE的RPG难题
- 订单系统水平分库的实践之路以及关键步骤
- HDOJ Let's go to play
- 引用传值与指针传值
- android view层次与位置大小
- centos7 五大查找常用命令