zoukankan      html  css  js  c++  java
  • 两个有序序列的中位数

    7-3 两个有序序列的中位数 (25分)
     
    已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列,的中位数指A​(N−1)/2​​的值,即第⌊个数(A​0​​为第1个数)。
    
    输入格式:
    输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
    
    输出格式:
    在一行中输出两个输入序列的并集序列的中位数。
    
    输入样例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
     

    代码如下:

    一、n不大时,实现功能的相对简洁形式

    #include <stdio.h>
    #include <stdlib.h> int main(int argc, const char *argv[])
    {
        int n, i, j, temp=0; 
        int *s = (int*)malloc(10000*sizeof(int));
        scanf("%d",&n); 
        for(i=0; i<2*n; i++)
        {
            scanf("%d",&s[i]); 
        }
        for(i=0; i<2*n; i++)
        {
            for(j=i+1; j<2*n; j++)
            {
                if(s[i] < s[j])
                {
                    temp = s[i];
                    s[i] = s[j];
                    s[j] = temp;
                }
            }
        }
        printf("%d", s[(2*n-1)/2]);
        free(s);
        return 0;
    } 

     二、n取最大时,可以通过PAT编译的代码

    #include <stdio.h>
    #include <stdlib.h> 
    int merge(int *a, int m, int *b, int n, int *c);
    void Input(int *Array, int n);
    
    int main(int argc, const char *argv[])
    {
        int n, i, index;    
        int a[100000],b[100000],c[200000]; //调用动态内存在PAT会出错 
        scanf("%d",&n); 
        Input(a,n);
        Input(b,n);
        index = merge(a,n,b,n,c)-1;          //数组长度-1 = 数组最大下标 
        printf("%d", c[(index-1)/2]);       //按照定义输出中位数 
        return 0;
    } 
    
    int merge(int *a, int m, int *b, int n, int *c)  //顺序数组,合并至2n
    {                                                 //参数m和n分别是数组a和数组b的长度 
        int i=0, j=0, k=0;
        while(i<m && j<n)
        {
            if     (a[i] < b[j])
                c[k++] = a[i++];
            else if(b[j] < a[i])
                c[k++] = b[j++];
            else
            {
                c[k++] = a[i++];
                c[k++] = b[j++];
            }             
        }
        while(i < m)           //复制剩余数据段
            c[k++] = a[i++];
        while(j < n)                   //复制剩余数据段
    
            c[k++] = b[j++];
        return k;                    //返回数值k是数组c的长度
    }
    
    void Input(int *Array, int n)  //输入顺序数组
    {
        int i;
        for(i=0; i<n; i++)
            scanf("%d",&Array[i]); 
    }
  • 相关阅读:
    css 弹出框
    net stop 出现1060错误
    a href=#与 a href=javascript:void(0) 的区别
    ubuntu如何安装Mac主题
    js arguments.callee & caller的用法及区别
    js函数——setinterval和setTimeout
    highcharts简介
    highcharts柱状图和饼图的数据填充
    jqgrid的外观重绘
    laravel定时任务
  • 原文地址:https://www.cnblogs.com/ytdyz/p/12336803.html
Copyright © 2011-2022 走看看