题目:设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(logn)时间的算法。
这题是老师布置的作业,一开始我想出的解法如下:
分治法:
1、先分别求出X和Y的中位数
2、比较两个数的大小,如果相等就返回。如果不等的话,去掉较大中位数所在的那个数组的较大的一半,去掉较小的中位数所在的数组的较小的一半
3、在规模减半的两个数组上递归调用。
4、如果一直没有遇到正好相等的情况,那么递归到最后会剩下四个数,则返回第二个数。因为这两个数组都是有n个元素,所以最终返回的必然是2n个数中的下中位数。
写了一个程序如下:
01
int
search(
int
[]
X
,
int p
,
int
q
,
02 int [] Y , int r , int s) {
03 int midx , midy;
04 if ((p + 1 == q) && ( r + 1 == s)) {
05 if ( X [p ] < Y [ r ])
06 return ( X [ q ] < Y [ r ]) ? X [ q ] : Y [ r ];
07 else
08 return ( Y [s ] < X [p ]) ? Y [s ] : X [p ];
09 }
10 else {
11 midx = (p + q) / 2;
12 midy = ( r + s) / 2;
13 if ( X [ midx ] < Y [ midy ])
14 return search( X , midx , q , Y , r , midy);
15 else if ( X [ midx ] > Y [ midy ])
16
02 int [] Y , int r , int s) {
03 int midx , midy;
04 if ((p + 1 == q) && ( r + 1 == s)) {
05 if ( X [p ] < Y [ r ])
06 return ( X [ q ] < Y [ r ]) ? X [ q ] : Y [ r ];
07 else
08 return ( Y [s ] < X [p ]) ? Y [s ] : X [p ];
09 }
10 else {
11 midx = (p + q) / 2;
12 midy = ( r + s) / 2;
13 if ( X [ midx ] < Y [ midy ])
14 return search( X , midx , q , Y , r , midy);
15 else if ( X [ midx ] > Y [ midy ])
16