利用分治法來求兩個排序陣列的中位數
阿新 • • 發佈:2019-02-01
有兩個陣列 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;
}