每日编程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!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值