这道题貌似还是一道考研题,但是很久了 好像是2011年的。大概意思就是一个如果一个序列S1(11,13,15,17,19)则中位数是15, S2=(2,4,6,8,20) ,如果把S1和S2按照升序合在一起则11是中位数。
让你写算法:
当然最常见的无非就是把他俩放在一个数组里然后直接就找到中间那个了,但是这样的算法复杂度就会变成O(N),有没有更好的办法呢,当然首先就要利用中位数的性质。
假设一个数列 a1 a2 a3 a4 …ak,ak+1,ak+2 …an 其中ak为中位数,如果我左右排除掉同样多的个数,会不会影响中位数的值呢,答案是当然不会,举个栗子

{1,3,4,5,6,8,9,10,12} 中位数为6,那我左边把1,3去掉 右边把10,12去掉 数列变为 4,5,6,8,9 。 中位数依旧是6啊。所以我们的算法变了,从原来的把俩个排序数列组合到一起去找,变成减少数组的个数方便查找。换句话说舍弃肯定中位数不在的数组元素,但是必须舍弃一样的数量,不然中位数就不对了。

那问题又来了 怎么最有效舍弃一样的数量,答案是二分法。。。
比较俩个数列的中位数,为了方便 设一个为a数列一个为b数列。ak为a数列的中位数,bk为b数列的中位数。,如果ak>bk说明了什么,说明bk的前面的元素注定了不会有中位数的存在了同样ak后面的元素就更大了 也不会有中位数的存在了。。
这样他们就是可以被舍弃的对象,但是请注意。。他们数量是相等的吗? 你会发现有时候相等,有时候不等。。。这个跟数列奇数个元素还是偶数个元素相关,那我们分别讨论。。。

当元素个数是奇数个的时候。。也就是说恰好中位数左边的个数和右边的个数是相等的。这个时候舍弃起来很省事。。。正好一样数量啊

但是当元素个数是偶数个的时候。。假设还是ak>bk这种情形 bk元素的前面是舍弃了和ak后面的元素数量是不相等的,数量上差一个。这个你可以自己举例子,bk那边少了一个,可你仔细一想bk,是肯定不会成为中位数的,所以为了数量相同,bk一样舍弃掉,这样就保证了数量相同。

下面是代码`

#include <stdio.h>
#include<stdlib.h>
#define M 10
#define N 10
void ran(int a[],int n)  //随机数组数
{srand(time(0));int i;for(i=0;i<n;i++){a[i]=rand()%100;}}
int cmp(const void *p,const void *q) //qsort函数的比较函数
{return *(int *)p-*(int *)q;
}
int find(int a[],int n,int b[],int m)    //查找中位数函数
{int lowa,higha,lowb,highb,mida,midb,i;lowa=0;higha=n-1;lowb=0,highb=m-1;while(lowa!=higha||lowb!=highb){mida=(lowa+higha)/2;midb=(lowb+highb)/2;if(a[mida]==b[midb])   //俩个中位数相同  那恭喜就是了{return  a[mida];}elseif(a[mida]<b[midb]){if((higha-lowa+1)%2==1) //判断个数奇数{lowa=mida;highb=midb;}else{lowa=mida+1;    //多加一个平衡数量highb=midb;}}elseif(a[mida]>b[midb])   //和上面逻辑一样{if((highb-lowb+1)%2==1){higha=mida;lowb=midb;}else{lowb=midb+1;higha=mida;}}}return a[lowa]<b[lowb]?a[lowa]:b[lowb];}void output(int a[],int n)   //输出数组函数   验证用的
{int i;for(i=0;i<n;i++)printf("%3d ",a[i]);printf("\n");
}
void  test(int a[],int n,int b[],int m,int c[])  //用最差的方法合并数组去验证前面的find算法
{int i=0,j=0,k=0;while(i<n&&j<m){if(a[i]<=b[j])c[k++]=a[i++];elseif(a[i]>b[j])c[k++]=b[j++];}while(i<n)c[k++]=a[i++];while(j<m)c[k++]=b[j++];output(c,m+n);printf("test x=%d\n",c[k/2-1]);}int main(int argc, char *argv[])
{int a[N];int b[M];int c[N+M];ran(a,N);sleep(1);ran(b,M);qsort(a,N,4,cmp);qsort(b,M,4,cmp);output(a,N);printf("\n");output(b,M);int x=find(a,N,b,M);test(a,N,b,M,c);     //验证用的printf("x=%d\n",x);return 0;
}

俩个相同大小升序序列合并在一起的中位数解法相关推荐

  1. DHU数据结构-顺序表- ADT应用-找出两个等长升序序列的中位数

    目录 1.题目 2.题解 3.代码实现 1.题目 顺序表ADT模板简单应用算法设计:找出两个等长升序序列的中位数 作者: 教材 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使用自行设计 ...

  2. C语言序列是否有序、序列中删除指定数字、序列中整数去重、有序序列合并问题

    近期在牛客上面刷题遇到了上述问题,对于刚接触C的我还是有些头疼,所以写这篇文章整理一下思路. 文章推荐人群:刚接触C的广大同志们 我将以 题+代码+简易的思路 的方式进行,提前感谢老铁们的阅览! 序列 ...

  3. 求两等长升序序列的中位数

    题目:一个升序序列的中间位置的元素称为中位数,两个序列的中位数则是这两个序列升序排好序后的中间的数为中位数,现有两个等长的生序序列     A.B,找出它们的中位数. 分析:         我们可以 ...

  4. 扩增子分析解读1质控,实验设计,双端序列合并

    写在前面 之前发布的<扩增子图表解读>系列,相信很多朋友都看过了(链接直达7月文章目录). 这些内容的初衷是写给刚进实验室的学生读,加速大家对同行文章的解读能力.如果连同行的结果都看不懂, ...

  5. 洛谷 一种堆套路 P1631序列合并、P2085最小函数值

    题目链接 序列合并 最小函数值 题解 这两道题做法基本一样,是使用同一种套路解决的,这里用序列合并来举例说明. 序列合并要求出N2N2N^2个和中最小的N个数. 我们用一个堆来维护我们需要的数,并且保 ...

  6. 算法探索_多序列合并去重

    最近项目中用到了合并去重的相关需求,于是这边总结了不同的去重方式 这边是深海封装的去重合并方法: /**作者:赵星海*时间:2020/6/15 17:46*用途:多序列合并去重*/public Arr ...

  7. [C语言]使用指针将输入的多个字符串按大小升序排序

    [C语言]使用指针将输入的多个字符串按大小升序排序 1.题目 2.完整代码 3.截图 1.题目 编写一个函数,利用指针将输入的多个字符串按大小升序排序 要求:子函数 void StrSort(char ...

  8. 整数序列中的众数和中位数

    描述 输入无符号整数序列(不多于500个整数,每个整数不大于150),计算序列的众数和中位数. 众数是指出现次数最多的那个数:如果有多个数出现的次数都达到最多,则取最先出现的数为众数:如果所有的数都相 ...

  9. 俩个有序顺序表的合并(好好学习)

    Elementype GetElem(list L, Position pos) {if (pos<0 || pos>L->last){return ERROR;}else{retu ...

最新文章

  1. ASP.NET中gridview获取当前行的索引值
  2. 一点一滴培养你的领导气质
  3. mysql多实例脚本
  4. rabbitmq用户权限管理
  5. 扑克牌比大小c语言,算了算学了有一个月c语言了,写了个扑克牌程序
  6. 【重磅快讯】T11 2019数据智能技术峰会举办,AI将成为行业颠覆者
  7. linux nohup 后台运行
  8. 监控SRE的黄金信号
  9. ElasticSearch入门教程-索引
  10. php搜索所有路线,php包含文件路径查找规则
  11. java编程executor框架_Java并发编程 - Executor框架(一)Executor,
  12. No modules named ‘tensorflow.compat.v2‘
  13. apache下虚拟域名配置
  14. 百度地图坐标和高德地图坐标转换
  15. php 虚线怎么画,ps画虚线最详细教程
  16. iOS - 一份参考简历,请注意查收!
  17. 制作Java视频播放器
  18. Python 爬虫json格式化输出
  19. 优秀logo设计解析_40+给你灵感的优秀LOGO设计作品
  20. excel滚轮_Excel滚轮快捷键

热门文章

  1. 好的网站大推荐,持续修改及更新,大家亦可评论推荐
  2. 提醒事项默认列表怎么设置
  3. html输入公式得到混合运算结果,excel表格乘法公式怎么输入
  4. 大话手机处理器-世界上最复杂的芯片
  5. java 头像 微信群_JAVA-仿微信九宫格头像
  6. Laravel 华为推送
  7. 雷蛇新款灵刃 18评测怎么样
  8. 第一章:unity性能优化之内存优化
  9. ibm收购红帽满清十大酷刑_IBM Business Process Manager的十大编辑精选
  10. 移动端获取当前屏幕的高度_css中获取屏幕的宽 高