#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中较大部分也就是后半部分