中位數(中指)是指一串元素序列中值處於中間的那個元素。
求中位數最直觀的一種想法是,先將數據排個序,然後取中間元素,平均複雜度爲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!!!