1. 实践题目
7-3 两个有序序列的中位数
2. 问题描述
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
在一行中输出两个输入序列的并集序列的中位数。
3. 算法描述
算法思路为:将第一个数组与第二个数组按非降序的排列顺序合并为一个新的数组,之后在该新的有序数组中寻找并输出中位数
流程大致为:
main()函数
输入序列的公共长度
输入第一个数组
输入第二个数组
调用Search Median()函数找到并输出两个有序序列并集的中位数
算法如下:
int SearchMedian(int a[], int b[], int c[], int l, int r){
int i = l, j = l, k = l;
while((i <= r) && (j <= r))
if(a[i] <= b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
if(i > r) for(int q = j; q <= r; q++) c[k++] = b[q];
else for (int q = i; q <= r; q++) c[k++] = a[q];
return c[(k-2)/2];
}
4. 算法时间及空间复杂度分析
时间复杂度:while循环内的语句执行n-1次,后面if语句中的for循环执行n-j或n-i次,所以时间复杂度为O(n)
空间复杂度:所需辅助空间是常数级别的,,所以空间复杂度为O(1)
5. 心得体会
做这道题目模仿了合并排序算法中的Merge函数,将两个有序序列合并为一个数组并进行排序。因为有课堂上的学习,所以编程时思路清晰,出现的一点小问题也及时解决,对排序也有了更深刻的理解。