#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int Find(int array[],int start,int end,int k){
int temp=array[start];
int i=start,j=end-1;
while(i!=j){
while(i<j&&array[j]<=temp)
j--;
while(i<j&&array[i]>=temp)
i++;
if(i<j){
int t=array[i];
array[i]=array[j];
array[j]=t;
}
}
array[start]=array[i];
array[i]=temp;
//for(int i=0;i<5;i++)
// cout<<array[i]<<' ';
//cout<<endl;
if(i-start+1==k)
return array[i];
else if(i-start+1>k){
//cout<<start<<' '<<end<<' '<<k<<':';
return Find(array,start,i,k);
}
else{
//cout<<start<<' '<<end<<' '<<k<<':';
return Find(array,i+1,end,k-(i-start+1));
}
}
int main(){
int n,k;
cin>>n>>k;
int array[n];
for(int i=0;i<n;i++)
cin>>array[i];
cout<<Find(array,0,n,k)<<endl;
r
第K大元素(分治法)
最新推荐文章于 2023-11-02 13:37:58 发布