AC

键盘敲碎夜深沉,代码如麻乱假真  •  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;
}


评论:

请先登录,才能进行评论