有序数组的中位数
1. 如果两个数组是等长的,可以用如下的策略:
// 好像有点问题 // 寻找两个升序数组的中位数 int m_search(int A[], int B[], int n) // n 代表长度 { int i1=0, j1=n-1, m1; int i2=0, j2=n-1, m2; // 分别代表两个数组的左右下标, 以及中位数m下标 while(i1!=j1 || i2!=j2) { m1 = (i1+j1)/2; m2 = (i2+j2)/2; if(A[m1] == B[m2]) { return A[m1]; } if(A[m1] < B[m2]) { if((i1+j1)%2==0) { //元素个数为奇数,注意下标从0开始 i1=m1; // 舍弃A[]的左边,但保留中位数 j2=m2; // 舍弃b[]的右边,但保留中位数 } else { // 元素个数为偶数 i1=m1+1; // 舍弃A[]的左边和中位数 j2=m2; // 舍弃B[]的右边,但保留中位数 } } else{ if((i1+j1)%2==0) { //元素个数为奇数,注意下标从0开始 j1=m1; // 舍弃A[]的右边,但保留中位数 i2=m2; // 舍弃b[]的左边,但保留中位数 } else { // 元素个数为偶数 j1=m1+1; // 舍弃A[]的右边,但保留中位数 i2=m2; // 舍弃B[]的左边和中位数 } } } // return A[i1] < B[i2] ? A[i1] : B[i2]; printf("%d %d\n", A[i1], B[i2]); return (A[i1]+B[i2]); }
2. 如果两个有序数组不是等长的,则要稍微麻烦一些:
*******