已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
输入样例1:
5
1 3 5 7 9
2 3 4 5 6
输出样例1:
4
一、递归算法
#include <iostream>
using namespace std;
void merge(const int* a, const int* b, int* c, int n, int i, int j, int t) {
if (i >= n) {
while (j < n) c[t++] = b[j++];
return;
}
if (j >= n) {
while (i < n) c[t++] = a[i++];
return;
}
if (a[i] <= b[j]) {
c[t] = a[i];
merge(a, b, c, n, i + 1, j, t + 1);
} else {
c[t] = b[j];
merge(a, b, c, n, i, j + 1, t + 1);
}
}
int main() {
int n;
cin >> n;
int a[n];
int b[n];
int c[2 * n]; // 存放合并后的数组
// 输入第一个序列
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 输入第二个序列
for (int i = 0; i < n; i++) {
cin >> b[i];
}
// 合并两个序列
merge(a, b, c, n, 0, 0, 0);
// 计算中位数
int mid = (2 * n) / 2; // 0-based index for middle element
cout << c[mid - 1] << endl; // 输出中位数
return 0;
}
二、非递归算法
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
int a[n];
int b[n];
int c[2*n]; // 存放合并后的数组
// 输入第一个序列
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 输入第二个序列
for (int i = 0; i < n; i++) {
cin >> b[i];
}
// 合并两个序列
int i = 0, j = 0, t = 0;
while (i < n && j < n) {
if (a[i] <= b[j]) {
c[t++] = a[i++];
} else {
c[t++] = b[j++];
}
}
// 处理剩余元素
while (i < n) {
c[t++] = a[i++];
}
while (j < n) {
c[t++] = b[j++];
}
// 计算中位数
int mid = (2 * n) / 2; // 0-based index for middle element
cout << c[mid-1] << endl; // 输出中位数
return 0;
}