求等长升序序列A、B的中位数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HarvestWu/article/details/83959745

分别求A、B序列的中位数a,b;

  1. 若a=b;则a或b为所求中位数,算法结束;
  2. 若a<b;则舍弃序列A中较小一半,舍弃序列B中较大一半;(注:需保证舍弃长度相等,代码分奇偶处理即保证等长)
  3. 若a>b;则舍弃序列A中较大一半,舍弃序列B中较小一半;(注:需保证舍弃长度相等,代码分奇偶处理即保证等长)
  4. 在保留的两个序列中,重复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;
}

猜你喜欢

转载自blog.csdn.net/HarvestWu/article/details/83959745