版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HarvestWu/article/details/83959745
分别求A、B序列的中位数a,b;
- 若a=b;则a或b为所求中位数,算法结束;
- 若a<b;则舍弃序列A中较小一半,舍弃序列B中较大一半;(注:需保证舍弃长度相等,代码分奇偶处理即保证等长)
- 若a>b;则舍弃序列A中较大一半,舍弃序列B中较小一半;(注:需保证舍弃长度相等,代码分奇偶处理即保证等长)
- 在保留的两个序列中,重复1、2、3步,直到两个序列均只含一个数为止,返回较小者为中位数。
注:这里定义的含n个元素的序列第int((n+1)/2)个元素为中位数,即元素个数/2向上取整。
#include <bits/stdc++.h>
#define ArrayLen(array) sizeof(array)/sizeof(array[0])
/*
* Created by HarvestWu on 2018/11/11.
*/
using namespace std;
int M_Search(int A[], int B[], int n){
int start1 = 0, end1 = n - 1; //序列A首、尾数
int start2 = 0, end2 = n - 1; //序列B首、尾数
int mid1, mid2; //序列A、B中位数
while (start1 != end1 || start2 != end2){
mid1 = (start1 + end1) / 2;
mid2 = (start2 + end2) / 2;
if (A[mid1] == B[mid2])
return A[mid1];
if (A[mid1] < B[mid2]){
if ((end1 - start1) % 2 == 0){ //奇数个元素
start1 = mid1; //舍弃A中点以前的部分并保留中点
end2 = mid2; //舍弃B中点以后的部分并保留中点
}
else{ //偶数个元素
start1 = mid1+1; //舍弃A中点及其以前的部分
end2 = mid2; //舍弃B中点以后的部分并保留中点
}
}
else{
if ((end2 - start2) % 2 == 0){ //奇数个元素
start2 = mid2; //舍弃B中点以前的部分并保留中点
end1 = mid1; //舍弃A中点以后的部分并保留中点
}
else{ //偶数个元素
start2 = mid2 + 1; //舍弃B中点及其以前的部分
end1 = mid1; //舍弃A中点以后的部分并保留中点
}
}
}
return A[start1] < B[start2] ? A[start1] : B[start2];
}
int main(){
int A[] = { 1, 3, 5, 7, 9,11 };
int B[] = { 2, 4, 6, 8, 10 ,12};
cout << M_Search(A, B, ArrayLen(A));
return 0;
}