回顾一下这周学的快速排序
1.确定分界点
2.调整区间(左边的数<=x,右边的数大于等于x)
3.递归处理左右两段
现在有如下题
例题:第k个数
输入n,k
有n个数,表示第k小的数
#include<bits/stdc++.h>
using namespace std;
vector<int>v;
int quick_sort(int l,int r,int k){
if(l>=r)return v[l];//用大于等于是因为快排的数组可能为空
int x=v[l],i=l-1,j=r+1;
while(i<j){
do i++;while(v[i]<x);
do j--;while(v[j]>x);
if(i<j)swap(v[i],v[j]);
}
int s1=j-l+1;
if(k<=s1)return quick_sort(l,j,k);
return quick_sort(j+1,r,k-s1);//减去s1是因为已经有这么多值比它大了
}
int main(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
int x;
cin>>x;
v.push_back(x);
}
int res=quick_sort(0,v.size()-1,k);
cout<<res;
}
大体模板还是一样的,就是中间细节改一改