题意 给你无序序列,找第k大的数
思路 直接排序就能过。。。不过为了练练手,就写了个O(n)的算法~很经典~
快排算法是向枢轴两侧递归的去快排,而这里只向一边去快排,当枢轴位置>k,向左快排,反之,向右即可~
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[1000006];
int n,k;
int partition(int l,int r)
{
while(l != r)
{
while(a[r] >= a[l] && r > l)
r--;
if(l == r)
break;
swap(a[r],a[l]);
while(a[l] < a[r] && r > l)
l++;
if(l < r)
swap(a[r],a[l]);
}
return l;
}
int findK(int l,int r)
{
int now = partition(l,r);
if(k < now)
return findK(l,now-1);
else if(k > now)
return findK(now+1,r);
else
return a[now];
}
int main()
{
scanf("%d%d",&n,&k);
k--;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("%d\n",findK(0,n-1));
return 0;
}