算法导论9.3-8 找出已排序的2个数组X[1..n]和Y[1..n]的共2n个数的中位数

//O(nlgn)找sorted的X[1..n]和Y[1..n]的共2n个数的中位数
//先排序,再找第n大的数(下中位数)
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int M=5000000;
struct FOO{
    int num;
    int status;
}A[M*2+5];
bool cmp(const FOO& a,const FOO& b)
{
    return a.num<b.num;
}
void TWO_ARRAY_MEDIAN(FOO A[],int n)
{
    sort(A+1,A+2*n+1,cmp);//对合并数组排序
    if(A[n].status<=n)//第n大的数就是了
        printf("在X中,下标%d,值%d\n",A[n].status,A[n].num);
    else
        printf("在Y中,下标%d,值%d\n",A[n].status-n,A[n].num);
}
int main(void)
{
    freopen("1.txt","r",stdin);
    int n,i;
    scanf("%d",&n);
    //第1到n个数是属于X的,第n+1到2n是属于Y的
    for(i=1;i<=n+n;i++)//先将X和Y合并为一个数组,且要记住该元素在X还是在Y中
        scanf("%d",&A[i].num),A[i].status=i;
    TWO_ARRAY_MEDIAN(A,n);
    return 0;
}
//O(lgn)找sorted的X[1..n]和Y[1..n]的共2n个数的中位数
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int M=5000000;
int X[M+5],Y[M+5];
int FIND_MEDIAN(int A[],int B[],int n,int low,int high)
{
    while(1){
        if(low>high) return 0;//找不到
        int mid=(low+high)/2;
        if(mid<n&&B[n-mid]<=A[mid]&&A[mid]<=B[n-mid+1])
            return mid;
        if(mid==n&&A[n]<=B[1])
            return mid;
        if(A[mid]>B[n-mid+1]) high=mid-1;
        else low=mid+1;
    }
}
void TWO_ARRAY_MEDIAN(int X[],int Y[],int n)
{
    int median_index=FIND_MEDIAN(X,Y,n,1,n);
    if(median_index)
        printf("在X中,下标%d,值%d\n",median_index,X[median_index]);
    else{//在X中找不到,所以就是在Y中
        median_index=FIND_MEDIAN(Y,X,n,1,n);
        printf("在Y中,下标%d,值%d\n",median_index,Y[median_index]);
    }
}
int main(void)
{
    freopen("1.txt","r",stdin);
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d",X+i);
    for(i=1;i<=n;i++) scanf("%d",Y+i);
    TWO_ARRAY_MEDIAN(X,Y,n);
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值