您的位置:首页 > 其它

利用分治法来求两个排序数组的中位数

2015-12-20 20:23 411 查看
有两个数组 ar1[] 和ar2[] 两个数组的长度都为n

求ar1[]和ar2[]的中位数

可以借鉴归并排序的思想 实质上就是将将两个已经排好序的数组 合并成一个数组 的过程只是在这个过程中添加了一个计算从小到大的次序的数

(count ) 当count =n 和n+1时记录下这两个数 然后在这两个数中间取平均值 就可以了 但是这个算法的复杂度是o(n)

如果我们想达到log(n)的复杂度的话 则可以用分治法来实现

求出 ar1[]的中位数 m1 ar2[]的中位数 m2

1.如果m1==m2 则返回m1就可以了

2.如果m1>m2 则取ar1[]中的前半部分和 m2中的后半部分 作为新的数组

3.如果m1

int median(int arr[], int n)
{
if (n%2 == 0)
return (arr[n/2] + arr[n/2-1])/2;
else
return arr[n/2];
}

int getMedian(int ar1[], int ar2[], int n) {
int m1;
int m2;
if (n <= 0)
return -1;
if (n == 1)
return (ar1[0] + ar2[0]) / 2;

if (n == 2)
return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1])) / 2;

m1 = median(ar1, n);
m2 = median(ar2, n);
/* 相等可直接返回 */
if (m1 == m2)
return m1;
if (m1 < m2) {
if (n % 2 == 0)
return getMedian(ar1 + n/2-1, ar2, n/2 + 1);
else
return getMedian(ar1 + n/2, ar2, n/2+1);
} else {
if (n % 2 == 0)
return getMedian(ar2 + n/2-1, ar1, n/2+1);
else
return getMedian(ar2 + n/2, ar1, n/2+1);
}
}

int main()
{
int ar1[] = {1, 12, 10, 26, 38};
int ar2[] = {2, 13, 17, 30, 45};

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");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: