基础算法2:快速排序与快速选择

1.快速排序

step1:找到分界点x,q[L],q[L+R/2],q[R]

step2:左边所有的数都小于等于分界点x,右边的所有数都大于等于x

step3:递归排序左边,递归排序右边

模版如下:

void quick_sort(int q[], int l, int r)
{
    //注意点1:跳出条件
    if (l >= r) return;
    
    //注意点2:左右游标选择
    int i = l - 1, j = r + 1, x = q[l + r >> 1];

    //注意点3:判出条件
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    //注意点4:递归排序[l,j][j+1,r]
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

2.快速查找

step1:找到分界点x,q[L],q[L+R/2],q[R]   游标:i=l-1, j=r+1

step2:左边[l,j]所有的数都小于等于分界点x,右边的所有数[j+1,r]都大于等于x

step3:递归查找左边,递归查找右边

模版如下:有5点需要注意

int quick_search(int l,int r,int k)
{
    if(l==r) return q[l];
    
    //x选取具有任意性
    int x=q[l+r>>1];
    //注意点1:i,j的取值为左右端点-1,+1
    int i=l-1,j=r+1;
    
    //注意点2:判出的条件
    while(i<j)
    {
        //注意点3:左移和右移的条件
        do i++; while (q[i]<x);
        do j--; while (q[j]>x) ;
        //注意点4:交换的条件
        if(i<j) swap(q[i],q[j]);
    }
    //左区间[l,j] 右区间[j+1,r]
    int sl=j-l+1;
    
    //注意点5:值所在的区域
    if(k<=sl) return  quick_search(l,j,k);
    else return quick_search(j+1,r,k-sl);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值