重复

导航

算法第二章上机实验报告

1.实践题目:

两个有序序列的中位数 

2.问题描述:

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0​​,A1​​,,AN1​​的中位数指A(N1)/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.心得体会:

在这次的上机实践中,我们因为一些小小的错误没有被发现而一直在停滞不前,后来看了很多次之后终于发现了,这提醒我们一定要看仔细,并且一开始我们并没有考虑到特殊情况,比如奇偶长度等。

 

posted on 2018-10-21 22:44  重复  阅读(135)  评论(0编辑  收藏  举报