每日編程18之中位數/任意第K大的元素

中位數(中指)是指一串元素序列中值處於中間的那個元素。

求中位數最直觀的一種想法是,先將數據排個序,然後取中間元素,平均複雜度爲O(nlogn)。

另一種巧妙的想法是利用快速排序的劃分步驟,每次將元素序列劃分二份,中位數必然存在於其中的一個子序列,這樣每次劃分都可以拋去部分序列。

這種算法的時間複雜度爲O(n)


遞歸函數,求解(p,q)序列中的第k個元素,,...int midValue(p,q,k)

初始時爲求解(0,n-1)序列中的第n/2個元素,,int midValue(0,n-1,n/2)

每次按照快速排序中劃分方式進行劃分,確定pivot value的位置pos,

然後進行判斷,若pos==p+k,則返回A[pos]的值

若pos>k,則說明需要的第k個元素在左子序列,直接求座子序列的第K個元素,midValue(p,pos-1,k)

若pos<k,則說明需要的第k個元素在右子序列,直接求由子序列的第k-pos個元素,midValue(pos+1,q,k-pos-1)


核心代碼:

int midValue(int A[],int p,int q,int k)
{
        int i=p-1;
        int j;
        int pivot = A[q];
        for(j=p;j<q;j++)
        {
                if(A[j] < pivot)
                {
                        SWAP(A[i+1],A[j]);
                        i++;
                }
        }
        SWAP(A[i+1],A[q]);
        int pos = i+1;
        if(pos == p+k)  return A[pos];
        if(pos > p+k)   return midValue(A,p,pos-1,k);
        if(pos < p+k)   return midValue(A,pos+1,q,k-pos-1);
}


OVER!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章