| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1857 人关注过本帖
标题:小白在线求教 用归并排序实现查找两个有序序列的中位数
只看楼主 加入收藏
哈罗德的路
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2020-4-28
结帖率:66.67%
收藏
已结贴  问题点数:5 回复次数:7 
小白在线求教 用归并排序实现查找两个有序序列的中位数
两个有序序列的中位数 (20分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
输入样例1:51 3 5 7 92 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"
#include "stdlib.h"
#define N 100000
using namespace std;
void Merge(int r1[N],int low,int mid,int high,int r2[N])
{ //合并两个序列
int i=low;//第一个序列的第一个元素
int j=mid+1;//第二个序列的第一个元素
int k=low;//合并后新序列的第一个元素
while((i<=mid)&&(j<=high))
{//两序列进行合并时元素均未取完
if(r1[i]<=r1[j])//序列1的元素小于序列2的 ,则将序列1的元素放入新序列中
r2[k++]=r1[i++];
else//反之,将序列2的元素放入新序列中
r2[k++]=r1[j++];
}
while(i<=mid)//若序列2的元素全放入新序列,而序列1的元素未放完,则将序列1剩余元素放入新序列
{r2[k++]=r1[i++];}
while(i<=mid)//若序列1的元素全放入新序列,而序列2的元素未放完,则将序列2剩余元素放入新序列
{r2[k++]=r1[j++];}
}
void MSort(int r1[N],int low,int high,int r3[N])
{//归并排序
int mid;
int *r2;
r2=(int *)malloc(sizeof(int)*(high-low+1));//辅助数组空间
if(low==high)//序列元素刚好都放入
r3[low]=r1[low];
else
{
mid=(low+high)/2;//找中间点
MSort(r1,low,mid,r2);//递归划分左半区
MSort(r1,mid+1,high,r2);//递归划分右半区
Merge(r2,low,mid,high,r3);//合并已经排好的部分
}
free(r2);
}
void MergeSort(int r[],int n)//归并排序入口
{
int high,low;
int *r2;
r2=(int *)malloc(sizeof(int)*(high-low+1));//辅助空间
MSort (r,0,n-1,r2);
free(r2);
}
int main(){
int a[N],b[N],c[N],d[N],e[N];
int n,i,j;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (j=0;j<n;j++)
scanf("%d",&b[j]);
MergeSort(a,n);
MergeSort(b,n);
for(i=0;i<2*n;i++)
printf("%d ",a[i]);
//printf("%d\n",c[(2*n-1)/2]);
}

搜索更多相关主题的帖子: mid 序列 元素 int 位数 
2020-12-15 18:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:5 
输入样例1:51 3 5 7 92 3 4 5 6输出样例1:4输入样例2:6-100 -10 1 1 1 1-50 0 2 3 4 5输出样例2:1
你贴完了题目后,高傲得看一眼都不行吗?我猜是
输入样例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


看你的代码,你怎么在排序呀?你明明说过“两个有序序列”。

    1 3 5 7 9
    2 3 4 5 6
为例,
1 和 2 比,取 1;
3 和 2 比,取 2;
3 和 3 比,取 3;(随便取哪个序列中的3都可以,假设就取第一个序列中的3吧)
5 和 3 比,取 3;
4 和 5 比,取 4。因为取了5个数了,那结果就是 4


    -100 -10 1 1 1 1
    -50 0 2 3 4 5
为例,
-100 和 -50 比,取 -100;
-10 和 -50 比,取 -50;
-10 和 0 比,取 -10;
1 和 0 比,取 0;
1 和 2 比,取 1;
1 和 2 比,取 1。因为取了6个数了,那结果就是 1
2020-12-15 20:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
程序代码:
#include <stdio.h>

int main( void )
{
    size_t n;
    int s1[100000], s2[100000];
    scanf( "%zu", &n );
    for( size_t i=0; i!=n; ++i )
        scanf( "%d", &s1[i] );
    for( size_t i=0; i!=n; ++i )
        scanf( "%d", &s2[i] );

    size_t p=0, q=0;
    for( ; p+q+1<n; )
    {
        if( s1[p]<=s2[q] )
            ++p;
        else
            ++q;
    }
    printf( "%d\n", s1[p]<=s2[q] ? s1[p] : s2[q] );
}
2020-12-16 09:24
哈罗德的路
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2020-4-28
收藏
得分:0 
回复 楼主 哈罗德的路
该怎么改呢?
2020-12-16 19:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
以下是引用哈罗德的路在2020-12-16 19:38:44的发言:

该怎么改呢?

3楼的代码入不了你的法眼?
2020-12-16 20:21
哈罗德的路
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2020-4-28
收藏
得分:0 
回复 5楼 rjsp
哈哈哈,我用是的归并排序,用归并排序怎么改呢?
2020-12-17 09:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
以下是引用哈罗德的路在2020-12-17 09:52:54的发言:

哈哈哈,我用是的归并排序,用归并排序怎么改呢?

我在2楼说过,题目本身给你的序列就是有序的。再排序干嘛?
2020-12-17 12:23
哈罗德的路
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2020-4-28
收藏
得分:0 
回复 7楼 rjsp
题目的意思是要把两个有序序列重新排列成一个序列再找中位数,如何改代码让两个有序序列重新排列成一个序列再找中位数呢?
2020-12-17 13:44
快速回复:小白在线求教 用归并排序实现查找两个有序序列的中位数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032872 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved