快速选择算法

摘要:选择第k小的元素,用快速排序的思想可以以平均O(NlogN)的时间界做到.
(1)首先找到中间值,并且进行排序。
(2)如果左边的子序列的长度|S1|==k-1,那么很显然中间值就是所求.
(3)如果左边的子序列的长度|S1| >=k,那么显然这个所求元素就在子序列S1里面,递归的在S1里面求解;
(4)如果|S1| < k-1那么k就在S2中.
(5)如果遇到一个小的子序列(子序列的长度很小),那么我们就用插入排序将它排序,然后返回第k个最小元;

代码:

void Quickselect(int *A,int Left,int Right,int order)//选择第order个最小元
{
    int Pivot,i,j;
    if (Left + cutoff <= Right)
    {
         Pivot = Median3(A,Left,Right);
        //进行分割
         i = Left, j = Right - 1;
         while(1)
         {
             //直到i,j交错为止
        while(A[++i] < Pivot){};
        while(A[--j] > Pivot){};
        if(i < j)
            swap(&A[i],&A[j]);
        else
             break;
         } 
         if (order < i+1)//注意order排序好之后的下标
             Quickselect(A,Left,i-1,order);
         else if (order > i+1)
         Quickselect(A,i+1,Right,order);
    }
    else
        Insertsort(A+Left,Right - Left + 1);
}
int QuickS(int *A,int N,int order)//快速选择算法的驱动例程
{
    int *memory = (int *)malloc(sizeof(int)*N);
    int k;
    memcpy(memory,A,N*sizeof(int));
    Quickselect(A,0,N-1,order);
    k = A[order - 1];
    memcpy(A,memory,N*sizeof(int));
    return k;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值