进阶实验1-3.1 两个有序序列的中位数 (25 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A 0,A 1 ,⋯,A N−1的中位数指A (N−1)/2的值,即第⌊(N+1)/2⌋个数(A 0
为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
输入样例1:
5
1 3 5 7 9
2 3 4 5 6
结尾无空行
输出样例1:
4
结尾无空行
输入样例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
输出样例2:
1
代码实现
#include <stdio.h>
const int N = 1e5+10;
int arr1[N];
int arr2[N];
int main()
{
int n, i, j, t = 0;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &arr1[i]);
for(i = 0; i < n; i++)
scanf("%d", &arr2[i]);
i = j = 0; //i用于arr1中循环,j用于arr2循环 二者用于统计各自在数组中的个数 i、j代表的是个数 在数组中应该是i-1 j-1
//当i+j = n时 说明已经找到中位数
while(i+j < n){
while(i+j < n && arr1[i] <= arr2[j]){ ///先从arr1中的数来与arr2中的第一个数进行比较,
i++; ///直到 找到大于arr2中的数,从而起到间接排序的作用 把arr2中的数排到arr1中
//printf("%d ", arr1[i]);
}
if(i+j < n){ //在排完arr2的数后,j++开始对下一个数进行排序 但是得先判断是否小于n
//printf("%d ", arr2[j]);
j++;
}
else{ //如果已经找到中位数 因为是执行i++之后找到的,所以是arr1中的数
printf("%d\n", arr1[i-1]); //已经找到就不能继续执行下的操作所以直接退出
return 0;
}
}
printf("%d\n", arr2[j-1]); //如果已经找到数组中中位数 ,因为最后操作是j++ 所以是arr2中的数
return 0;
}