April 26th, 2011几道题(5)
给定两个数组 X 和 Y,它们都包含 n 个元素且都是有序的,如何找到它们的中位数?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | template <typename T> T find_median(T seq1[],T seq2[],int n,int low,int high) { if(low>high) return (T)-999999; int k=(low+high)/2; if(k==n-1 && seq1[n-1]<=seq2[0]) return seq1[n-1]; else if(k<n-1 && seq1[k]>=seq2[n-k-1] && seq1[k]<=seq2[n-k]) return seq1[k]; else if(seq1[k]>seq2[n-k]) return find_median(seq1,seq2,n,low,k-1); else return find_median(seq1,seq2,n,k+1,high); } template <typename T> T two_array_median(T seq1[],T seq2[],int n) { T median=find_median(seq1,seq2,n,0,n-1); if(median==(T)-999999) return find_median(seq2,seq1,n,0,n-1); else return median; } |
求两有序数组(长度不一定相等)合并后的第i个元素(不一定是中位数)。
思路分析:
假设两个有序数组是A[1...n]和B[1...n],由于是寻找第i个元素,那么该元素只可能在A[1...i]与B[1...i]中,现在比较A[i/2]与B[i/2]
(1) A[i/2]==B[i/2],那么A[i/2](或者B[i/2])即要找的元素
(2) A[i/2]>B[i/2],那么第i个元素在A[1...i/2]和B[i/2...i]中,递归的在上述两个数组中查找第i/2个元素
(3) A[i/2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T median2(T* X, T* Y, int size)
{
int m = (size - 1) / 2;
if (X[m] == Y[m])
return X[m];
else if (X[m] > Y[m])
return size == 1 ? Y[m] : median2 (X, Y + size - m - 1, m + 1);
else
return size == 1 ? X[m] : median2 (X + size - m - 1, Y, m + 1);
}
int main(int argc,char* argv[])
{
int t1[]={1,2,3,3,4,4,5,6,9};
int t2[]={2,2,3,4,5,7,8};
cout<<"median 3 :"<<median2(t1,t2,7);
system("pause");
return 0;
}
Related posts(相关文章):
May 19th, 2011 at 12:37 pm
这种算法,我们数据结构老师不久前讲过,好像是出在一道考研题上面的,一般人都用类似归并排序的算法去实现,但这种解法确实难以想到。