1.实践题目:
两个有序序列的中位数
2.问题描述:
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
3.算法描述:
我们小组运用了第二章学习的分治法,即不断缩小子问题规模,最终合并问题。
我们先设了一个长度为2n的数组c,然后设置了两个类似指针的标记,取小的放在数组c首位,当两个标记都没有一动到数组最后一个字符的情况下,取小。
当一个数组先走完,则另一个数组的剩余部分全部copy过去。最后求出数组c的中间下标的那个字符,即为所求。
代码如下:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n],b[n];
int N;
N=2*n;
int c[N];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
if(0<=n&&n<=100000){
int i=0,j=0,k=0;
while(i<n&&j<n){
if(a[i]<b[j]){
c[k]=a[i];
i++;
k++;
}
else{
c[k]=b[j];
k++;
j++;
}
}
while(j<n){
c[k]=b[j];
k++;
j++;
}
while(i<n){
c[k]=a[i];
k++;
i++;
}
cout<<c[n-1]<<endl;
}
return 0;
}
4.算法时间及空间复杂度分析:
时间复杂度:该算法运用两个while来实现,时间复杂度为O(nlogn)
空间复杂度:最终得出空间复杂度为O (n)。
5.心得体会:
在这次的上机实践中,我们因为一些小小的错误没有被发现而一直在停滞不前,后来看了很多次之后终于发现了,这提醒我们一定要看仔细,并且一开始我们并没有考虑到特殊情况,比如奇偶长度等。