思路:
设定两个升序序列分别为A与B,中位数分别为a和b。
1)如a=b,则即为所求,算法结束。
2)当a< b时,抛弃A的较小的一般和B的较大的一半,并且舍弃的长度必须相等。
3)当 a > b时,抛弃A的较大的一般和B的较小的一半,并且舍弃的长度必须相等。
重复复进行1,2,3过程,知道两个序列均只含一个元素为止,较小者即为所求。
代码如下:
#include <iostream>
using namespace std;
int Median(int* A,int* B,int n)
{
int s1 = 0 , d1 = n-1, m1 = 0;
int s2 = 0 , d2 = n-1, m2 = 0;
while(s1 != d1 || s2 != d2){
m1 = (s1+d1) / 2;
m2 = (s2+d2) / 2;
if(A[m1] == B[m2]){
return A[m1];
}
if(A[m1] < B[m2]){
if((s1+d1)%2 == 0){
s1 = m1;
d2 = m2;
}else{
s1 = m1+1;
d2 = m2;
}
}else{
if((s2+d2)%2 == 0){
d1 = m1;
s2 = m2;
}else{
d1 = m1;
s2 = m2+1;
}
}
}
return (A[s1]<B[s2])?A[s1]:B[s2];
}
void Print(int* A,int n)
{
for(int i = 0 ; i < n ; i++){
cout<<A[i]<<" ";
}
}
int main()
{
int A[5] = {11,13,15,17,19};
int B[5] = {2,4,6,8,20};
cout<<"第一个数组为:"<<endl;
Print(A,5);
cout<<endl;
cout<<"第二个数组为:"<<endl;
Print(B,5);
cout<<endl;
cout<<"中位数为:";
int median = Median(A,B,5);
cout<<median<<endl;
return 0;
}
截图: