median of medians(中位數的中位數)
阿新 • • 發佈:2019-01-29
BFPRT(Blum、Floyd、Pratt、Rivest、Tarjan)演算法
最壞時間複雜度為O(n):
void insertionSort(int *A,int p,int r)
{
for(int j=p+1;j<=r;++j)
{
int key=A[r],i=j-1;
for(;i>=p&&A[i]>key;--i)A[i+1]=A[i];
A[i+1 ]=key;
}
}
int partition(int *A,int p,int r,int pivot)
{
swap(A[pivot],A[r]);
int i=p-1;
for(int j=p;j<r;++j)
{
if(A[j]<A[r])swap(A[++i],A[j]);
}
swap(A[i+1],A[r]);
return i+1;
}
int BFPRT(int *A,int p,int r,int k)
{
if(r-p+1<=5)
{
insertionSort(A,p,r);
return A[p+k-1];
}
int end=p-1;
for(int i=p;i+4<=r;i+=5)
{
insertionSort(A,i,i+4);
swap(A[++end],A[i+2]);
}
int mid=p+(end-p)/2;
BFPRT(A,p,end,mid);
int q=partition(A,p,r,mid);
int cur=q-p+1;
if(cur==k)return A[q];
else if(cur>k)return BFPRT(A,p,q -1,k);
else return BFPRT(A,q+1,r,k-cur);
}