median of medians(中位数的中位数)

BFPRT(Blum、Floyd、Pratt、Rivest、Tarjan)算法

https://en.wikipedia.org/wiki/Median_of_medians
这里写图片描述

最坏时间复杂度为O(n)

T(n) <= T(n/5) + T(7n/10) + an
T(n) <= cn
T(n/5) + T(7n/10) + an <= cn/5 + 7cn/10 + an = 9cn/10 + an <= cn
c >= 10a

实现

void swap(int *A,int p,int r)
{
    if(p!=r)
    {
        A[p]^=A[r];
        A[r]^=A[p];
        A[p]^=A[r];
    }
}

void insertionSort(int *A,int p,int r)
{
    for(int j=p+1;j<=r;++j)
    {
        int key=A[j],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,r);
    int i=p-1;
    for(int j=p;j<r;++j)
    {
        if(A[j]<=A[r])swap(A,++i,j);
    }
    swap(A,i+1,r);
    return i+1;
}

int BFPRT(int *A,int p,int r,int k)
{
    if(r-p+1<=5)
    {
        insertionSort(A,p,r);
        return p+k-1;
    }
    int end=p-1;
    for(int i=p;i+4<=r;i+=5)
    {
        insertionSort(A,i,i+4);
        swap(A,++end,i+2);
    }
    int mid=BFPRT(A,p,end,(end-p+2)/2);
    int q=partition(A,p,r,mid);
    int cur=q-p+1;
    if(cur==k)return q;
    else if(cur>k) return BFPRT(A,p,q-1,k);
    else return BFPRT(A,q+1,r,k-cur);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值