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);
}