1. 程式人生 > >利用分治法來求兩個排序陣列的中位數

利用分治法來求兩個排序陣列的中位數

有兩個陣列 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; }