面试题:从n个数中找出第K大的数
https://blog.csdn.net/orangefly0214/article/details/86527462
选一个枢轴点,用快排的方法将数组分为两部分,位于枢轴点左边的数都比它大,位于枢轴点右边的数都比它小,
1)如果枢轴点的索引刚好是k-1,则此时它对应的就是数组的第k大的数;
2)如果比k-1大,那么第k大的数位于它的左边部分;
3)如果比k-1小,那么第k大的数位于它的右边部分;
————————————————

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstdlib>
#include<cstring>
#include<vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef unsigned int uI;
typedef double db;
#define maxn 100005
#define inf 0x3f3f3f3f
#define maxm 200005
#define maxq 100005
int a[5000006],k;
int quicksort(int l,int r)
{
if(l==r) return a[l];
int i,j,x=a[l];
if(l<r)
{
i=l,j=r;
while(i<j)
{
while(i<j&&a[j]<=x) --j;
if(i<j) a[i++]=a[j];
while(i<j&&a[i]>=x) ++i;
if(i<j) a[j--]=a[i];
}
a[i]=x;
if(i==k) return a[i];
if(i<k) return quicksort(i+1,r);
else return quicksort(l,i-1);
}
}
int main()
{
int n,i;
while(~scanf("%d%d",&n,&k))
{
for(i=1;i<=n;++i) scanf("%d",&a[i]);
printf("%d\n",quicksort(1,n));
}
return 0;
}