Acwing 快速选择排序模板

63 阅读1分钟

786. 第k个数 - AcWing题库

image.png

思想

image.png

#include<iostream>
using namespace std;

const int N=100010;//题目n的最大范围是1e5,为了防止溢出,开1e5+10就行了。
 int s[N];
 
 
int   qu_sort(int L,int R,int k)
{
    //答案就在  (L  - R)区间内。L=R时,要找的值就是L或者R,返回哪个就一样。
    if(L==R)return s[L];
    
    
    //左右两边递归排序
    int x=s[L],i=L-1,j=R+1;
    while(i<j)
    {
        while(s[++i]<x);//s[+i]如果<x,那么i就++
        while(s[--j]>x);//s[-j]如果>x那么j就--
        if(i<j)swap(s[i],s[j]);
    }
    

    int SL=j-L+1;
    if(k<=SL)  return qu_sort(L,j,k);
    
    return qu_sort(j+1,R,k-SL);
}
int main()
{
    
    int n=0,k=0;
    cin>>n>>k;
   
    for(int i=0;i<n;i++)
    {
        cin>>s[i];
    }
    
  
    cout<<qu_sort(0,n-1,k)<<endl;
    return 0;
}