键盘敲碎夜深沉,代码如麻乱假真 • 1天前
/*
快排:分治;
指定一个基准数,使得基准数左边都比他小,右边都比他大;
他左边和右边各自排序
[left,right]表示还未检查的范围
用right去靠近left,直到找到第一个比基准数小的数,将它与基准数交换;
用left去靠近right,直到找到第一个比基准数大的数,将它与基准数交换;
最终,得到基准数左边都比他小,右边都比他大;
再对左边,右边分别如上操作
*/
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[1000005];
void sortk(int left,int right){
if(left>=right) return ;
int l=left,r=right;
while(l<r){
while(l<r&&a[l]<a[r]) r--;
if(l<r) swap(a[l],a[r]);
while(l<r&&a[l]<a[r]) l++;
if(l<r) swap(a[l],a[r]);
} //左右指针重合,该部分完成
sortk(left,l-1);
sortk(l+1,right);
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sortk(1,n);
cout<<a[k]<<"\n";
return 0;
}
评论:
请先登录,才能进行评论