中位数(中指)是指一串元素序列中值处于中间的那个元素。
求中位数最直观的一种想法是,先将数据排个序,然后取中间元素,平均复杂度为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!!!