int main(void) { int ar1[] = {1, 2, 3, 6}; int ar2[] = {4, 6, 8, 10}; int n1 = sizeof(ar1)/sizeof(ar1[0]); int n2 = sizeof(ar2)/sizeof(ar2[0]); if (n1 == n2) printf("Median is %d", getmedian(ar1, ar2, n1)); else printf("Doesn't work for arrays of unequal size"); getchar(); return 0; }
int getmedian(int arr1[],int arr2[],int n) { if(n==0) return -1; if(n==1) return (arr1[0]+arr2[0])/2; if(n==2) { return (max(arr1[0],arr2[0])+min(arr1[1],arr2[1]))/2; } int m1=median(arr1,n); int m2=median(arr2,n); if(m1==m2) return m1; if(m1<m2) { if(n%2==0) { return getmedian(arr1+(n/2)-1,arr2,n-(n/2)+1); } else { return getmedian(arr1+(n/2),arr2,n-(n/2)); } } else { if(n%2==0) { return getmedian(arr2+(n/2)-1,arr1,n-(n/2)+1); } else { return getmedian(arr2+(n/2),arr1,n-(n/2)); } } }
void fext_routine( int gto, int feature, int abs_src, int abs_set, int abs_graph ) { int i, cs, ns, fts, ncurves, extract_err; double datum, dummy, *absy; double y1, y2; int iy1, iy2; char tbuf[1024]; float *abscissa; abscissa = (float *)malloc( maxplot*sizeof(float) ); if( !isactive_graph( gto ) ){ errwin("Graph for results must be active"); return; } if( (ns=nextset( gto ) )== -1 ) { errwin("Choose a new graph or kill sets!"); return; } ncurves = nactive(cg); switch( abs_src ) { case 0: /* use index */ for( i=0; i<ncurves; i++ ) abscissa[i] = i+1; break; case 1: /* use legend label */ cs = 0; for( i=0; i<ncurves; i++ ){ while( !isactive_set( cg, cs ) ) cs++; if(!sscanf( g[cg].p[cs].lstr, "%f", &abscissa[i])) break; cs++; } if( i != ncurves ) { errwin("Bad legend label"); return; } break; case 2: /* use X from set */ if( !isactive_set( abs_graph, abs_set ) ){ errwin("Abscissa set not active"); return; } if( getsetlength( abs_graph, abs_set ) < ncurves ) { errwin("Not enough points in set"); return; } absy = getx( abs_graph, abs_set ); for( i=0; i<ncurves; i++ ) abscissa[i] = absy[i]; break; case 3: /* use Y from set */ if( !isactive_set( abs_graph, abs_set ) ){ errwin("Abscissa set not active"); return; } if( getsetlength( abs_graph, abs_set ) < ncurves ) { errwin("Not enough points in set"); return; } absy = gety( abs_graph, abs_set ); for( i=0; i<ncurves; i++ ) abscissa[i] = absy[i]; break; } cs = 0; tbuf[0] = '\0'; for( i=0; i<ncurves; i++ ) { while( !isactive_set( cg, cs ) ) cs++; extract_err = 0; switch( feature ) { case 0: /* Y minimum */ datum = g[cg].p[cs].ymin; break; case 1: /* Y maximum */ datum = g[cg].p[cs].ymax; break; case 2: /* Y mean */ stasum(gety(cg, cs), getsetlength(cg, cs), &datum, &dummy, 0); break; case 3: /* Y std dev */ stasum(gety(cg, cs), getsetlength(cg, cs), &dummy, &datum, 0); break; case 4: /* Y median */ getmedian( cg, cs, DATA_Y, &datum ); break; case 5: /* X minimum */ datum = g[cg].p[cs].xmin; break; case 6: /* X maximum */ datum = g[cg].p[cs].xmax; break; case 7: /* X mean */ stasum(getx(cg, cs), getsetlength(cg, cs), &datum, &dummy, 0); break; case 8: /* X std dev */ stasum(getx(cg, cs), getsetlength(cg, cs), &dummy, &datum, 0); break; case 9: /* X median */ getmedian( cg, cs, DATA_X, &datum ); break; case 10: /* frequency and period */ case 11: if ( ilog2(getsetlength(cg, cs)) <= 0) /* only DFT */ do_fourier(0, cs, 0, 1, 0, 0, 0); else /* FFT */ do_fourier(1, cs, 0, 1, 0, 0, 0); sprintf( tbuf, "FT of set %d", cs ); fts = 0; while( strcmp( tbuf, g[cg].p[fts].comments+1 ) ) fts++; minmax(gety(cg, fts), getsetlength(cg, fts),&y1,&y2,&iy1,&iy2); if( feature == 8 ) datum = g[cg].p[fts].ex[0][iy2-1]; else datum = 1./g[cg].p[fts].ex[0][iy2-1]; killset( cg, fts ); /* get rid of Fourier set */ break; case 12: /* first zero crossing */ if( get_zero_crossing( getsetlength( cg, cs ), getx( cg, cs ),gety( cg, cs ), &datum ) ){ sprintf( tbuf+strlen(tbuf), "Unable to find zero crossing of set %d\n", cs ); errwin( tbuf ); extract_err = 1; } break; case 13: /* rise time */ if( get_rise_time( getsetlength(cg,cs), getx(cg,cs), gety(cg,cs), g[cg].p[cs].ymin, g[cg].p[cs].ymax, &datum ) ){ sprintf( tbuf+strlen(tbuf), "Unable to find rise time of set %d\n", cs ); errwin( tbuf ); extract_err = 1; } break; case 14: /* fall time */ if( get_fall_time( getsetlength(cg,cs), getx(cg,cs), gety(cg,cs), g[cg].p[cs].ymin, g[cg].p[cs].ymax, &datum ) ){ sprintf( tbuf+strlen(tbuf), "Unable to find fall time of set %d\n", cs ); extract_err = 1; errwin( tbuf ); } break; case 15: /* slope */ if( mute_linear_regression( getsetlength( cg, cs ), getx( cg, cs ),gety( cg, cs ), &datum, &dummy ) ) { sprintf( tbuf+strlen(tbuf), "Unable to find slope of set %d\n", cs ); errwin( tbuf ); extract_err = 1; } break; case 16: /* Y intercept */ if( mute_linear_regression( getsetlength( cg, cs ), getx( cg, cs ), gety( cg, cs ), &dummy, &datum ) ) { sprintf( tbuf+strlen(tbuf), "Unable to find y-intercept of set %d\n", cs ); errwin( tbuf ); extract_err = 1; } break; case 17: /* set length */ datum = getsetlength( cg, cs ); break; case 18: /* half maximal widths */ if( get_half_max_width(getsetlength( cg, cs ), getx(cg,cs), gety(cg,cs), g[cg].p[cs].ymin, g[cg].p[cs].ymax,&datum) ) { sprintf( tbuf+strlen(tbuf), "Unable to find half maximal width of set %d\n", cs ); extract_err = 1; errwin( tbuf ); } break; case 19: /* Barycenter X */ get_barycenter( getsetlength( cg, cs ), gety(cg,cs), getx(cg,cs), &datum ); break; case 20: /* Barycenter Y */ get_barycenter( getsetlength( cg, cs ), getx(cg,cs), gety(cg,cs), &datum ); break; case 21: /* X of Maximum Y */ get_max_pos( gety(cg, cs), getx( cg, cs ), getsetlength( cg, cs ), g[cg].p[cs].ymax, &datum ); break; case 22: /* Y of Maximum X */ get_max_pos( getx(cg, cs), gety( cg, cs ), getsetlength( cg, cs ), g[cg].p[cs].xmax, &datum ); break; } if( !extract_err ) add_point( gto, ns, abscissa[i], datum, 0, 0, SET_XY ); cs++; } /* set comment */ switch( feature ) { case 0: /* Y minimum */ sprintf(tbuf,"Y minima of graph %d",cg); break; case 1: /* Y maximum */ sprintf(tbuf,"Y maxima of graph %d",cg); break; case 2: /* Y mean */ sprintf(tbuf,"Y means of graph %d",cg); break; case 3: /* Y std dev */ sprintf(tbuf,"Y std. dev.'s of graph %d",cg); break; case 4: /* Y median */ sprintf(tbuf,"Y medians of graph %d",cg); break; case 5: /* X minimum */ sprintf(tbuf,"X minima of graph %d",cg); break; case 6: /* X maximum */ sprintf(tbuf,"X maxima of graph %d",cg); break; case 7: /* X mean */ sprintf(tbuf,"X means of graph %d",cg); break; case 8: /* X std dev */ sprintf(tbuf,"X std. dev.'s of graph %d",cg); break; case 9: /* X median */ sprintf(tbuf,"X medians of graph %d",cg); break; case 10: /* frequency and period */ sprintf(tbuf,"frequencies of graph %d",cg); break; case 11: sprintf(tbuf,"periods of graph %d",cg); break; case 12: /* first zero crossing */ sprintf(tbuf,"zero crossings of graph %d",cg); break; case 13: /* rise time */ sprintf(tbuf,"rise times of graph %d",cg); break; case 14: /* fall time */ sprintf(tbuf,"fall times of graph %d",cg); break; case 15: /* slopes */ sprintf(tbuf,"slopes of graph %d",cg); break; case 16: /* Y intercepts */ sprintf(tbuf,"Y intercepts of graph %d",cg); break; case 17: /* set lengths */ sprintf(tbuf,"set lengths of graph %d",cg); break; case 18: /* 1/2 maximal widths */ sprintf(tbuf,"half maximal widths of graph %d",cg); break; case 19: /* barycenter X */ sprintf(tbuf,"X barycenters of graph %d",cg); break; case 20: /* barycenter Y */ sprintf(tbuf,"Y barycenters of graph %d",cg); break; case 21: /* X of maximum Y */ sprintf(tbuf,"X positions of maximum Y's of graph %d",cg); break; case 22: /* Y of maximum X */ sprintf(tbuf,"Y positions of maximum X's of graph %d",cg); break; } setcomment( gto, ns, tbuf ); free( abscissa ); plotone( gto ); }