面试题:从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; }