两个有序数组的中位数

两个等长的升序数组,在不创建新数组的情况下,求两个数组的所有元素的中位数

问题可以转化为:

设a、b分别为两个数组的中位数,则

①若a=b,则a即为所求

②若a<b,则舍去A中较小的一半,同时舍去B中较大的一半,要求两次舍去的序列长度相同

③若a>b,则舍去A中较大的一半,同时舍去b中较小的一半,要求两次舍去的序列长度相同

 

 


1
int M_Search(int A[],int B[],int n){ 2 // 首位数,末尾数,中位数 3 int s1=0,d1=n-1,m1; 4 int s2=0,d2=n-1,m2; 5 6 while (s1!=s2 || s2!=d2){ 7 m1=(s1+d1)/2; 8 m2=(s2+d2)/2; 9 if(A[m1]==B[m2]) //符合① 10 return A[m1]; 11 12 if(A[m1]<B[m2]){ //符合② 13 if((s1+d1)/2 == 0){ //元素个数为奇数 14 s1=m1; //舍弃A[s1]~A[m1-1] 15 d2=m2; //舍弃B[m2+1]~B[d2] 16 } 17 else{ //元素个数为偶数 18 s1=m1+1; //舍弃A[s1]~A[m1] 19 d2=m2; //舍弃B[m2]~B[d2] 20 } 21 } 22 else{ //符合③ 23 if((s2+d2)/2 == 0) //元素个数为奇数 24 s2=m2; //舍弃B[s1]~B[m2-1] 25 else //元素个数为偶数 26 s2=m2+1; 27 d1=m1; 28 } 29 } 30 if(A[s1]<B[s2)) 31 return A[s1]; 32 return B[s2]; 33 }

 

posted on 2020-02-10 18:02  黎夜  阅读(293)  评论(0编辑  收藏  举报