求两个数组的中位数,不合并数组

来源:互联网 发布:java poi 设置字体 编辑:程序博客网 时间:2024/05/04 07:49
数组a,b的中位数是a[m1],b[m2],
a[m1]=b[m2],则a[m1],b[m2]即为中位数
a[m1]<b[m2],舍弃a的左边,b的右边
a[m1]>b[m2],舍弃a的右边,b的左边
#include <stdio.h>#include <stdlib.h>int SearchMid(int a[], int b[], int n);int  main(){int n=5;int a[5]={1,2,7,9,10}, b[5]={6,7,8,9,10};int m1,m2;m1=m2=n/2;//a,b数组中位数a[m1],b[m1]相同,则中位数一定为 a[m1]或b[m1]if (a[m1] == b[m2])printf("中位数:%d",a[m1]);else  //不同的话则调用SearchMid函数 SearchMid(a, b, 5);}int SearchMid(int a[], int b[], int n){intstart1 = 0, end1 = n-1, m1;intstart2 = 0, end2 = n-1, m2;//首位不相同则说明数组的中位数还未找到还没有 while (start1 != end1 || start2 != end2) {m1 = (start1 + end1) / 2;m2 = (start2 + end2) / 2;//数组a的中位数小于数组b的中位数,舍去a的较小的一边,b较大的一边,舍去的数量要一样 //  舍去的a左边,b的右边 if (a[m1] < b[m2]) {if ((start1+end1) % 2 == 0) {//数组中数量为奇数 ,数组下标从零开始 start1 = m1;end2 = m2;} else {//数组中数量为偶数 ,数组下标从零开始 //中位数会偏左所以需要给a数组的舍去的左边加一位  start1 = m1 + 1;<span style="white-space:pre"></span>//使两边舍去的数量一样end2 = m2;}} //数组a的中位数大于数组b的中位数,舍去a的较大的一边,b较小的一边//舍去a的右边,b的左边 else {if ((start1+end1) % 2 == 0) {end1 = m1;start2 = m2;} else {end1 = m1;start2 = m2 + 1;}}}printf("中位数:%d %d\n",a[start1],b[start2]);}


0 0