快排模板:
将q数组中,[a,b]区间内的数据进行升序排序
调用:
quick_sort(q,a,b);
快排模板
void quick_sort(int q[],int l,int r)
{
//递归出口
if(l==r)return;
int x = q[l+r>>1];//[]内可随意更改为[l,r]内任意值
int i=l-1,j=r+1;
while(i<j)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
//或者
//while(q[++i]<x);
//while(q[--j]>x);
if(i<j)swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
快速选择算法(第k个数)
模板:
int quick_select(int q[],int l,int r,int k)
{
if(l==r)return q[l];
int x = q[l+r>>1];
int i=l-1,j=r+1;
while(i<j)
{
while(q[++i]<x);
while(q[--j]>x);
if(i<j)swap(q[i],q[j]);
}
int sl = j-l+1;
if(sl<=k) return quick_select(q,l,j,k);
else quick_select(q,j+1,r,k-sl);
//与快排的区别有:
//1.return需要返回一个值,包括递归出口和递归入口总共三个地方需要修改
//2.新增sl需要处理
}
//调用
int main()
{
cout<<quick_select(q,0,n-1,3);
}