7-8 两个有序序列的中位数(分治算法求解)

#include<bits/stdc++.h>
using namespace std;
void prepart(int& s, int& t) {
	int m = (s + t) / 2;
	t = m;
}
void postpart(int& s, int& t) {//取后半部分
	int m = (s + t) / 2;
	if ((s + t) % 2 == 0) {
		s = m;
	}
	else s = m + 1;去后半部分时要注意如果数组里元素个数为偶数时要m+1
}
int mindnum(int a[], int s1, int t1, int b[], int s2, int t2) {
	int m1, m2;
	if (s1 == t1 && s2 == t2) {
		return a[s1] < b[s2] ? a[s1] : b[s2];
	}
	else {
		m1 = (s1 + t1) / 2;
		m2 = (s2 + t2) / 2;
		if (a[m1] == b[m2]) {
			return a[m1];
		}
		if (a[m1] < b[m2]) {
			prepart(s2, t2);
			postpart(s1, t1);
			return mindnum(a, s1, t1, b, s2, t2);
		}
		else {
			prepart(s1, t1);
			postpart(s2, t2);
			return mindnum(a, s1, t1, b, s2, t2);

		}

	}
}
int main() {
	int n;
	cin >> n;
	int* a, * b;
	a = (int*)malloc(n * sizeof(int));
	b = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < n; i++) {
		cin >> b[i];
	}
	cout << mindnum(a, 0, n - 1, b, 0, n - 1);
}

利用分治思想

1,分别求出a,b数组的中位数a[m1],b[m2]

2,a[m1]=b[m2],则a[m1]就是两数组共同中位数

3,a[m1]<b[m2],则中位数在a数组中后半部霍数组b中较小部分也就是前半部分

4,a[m1]>b[m2],则中位数在a数组中前半部霍数组b中较大部分也就是后半部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值