[ZHOJ1131]Find K Min

题目大意:
  给你一个数列,求其中第K大的数。

思路:
  类似于快速排序的思想,每次可以确定出当前的的x在数组中的位置。
  然后根据位置选择该往左找还是往右找。

 1 #pragma GCC optimize(3)
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<bits/move.h>
 5 inline int getint() {
 6     register char ch;
 7     while(!isdigit(ch=getchar()));
 8     register int x=ch^'0';
 9     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
10     return x;
11 }
12 const int N=10000001;
13 int a[N];
14 int find(const int &l,const int &r,const int &k) {
15     int i=l,j=r;
16     const int x=a[(l+r)>>1];
17     do {
18         while(a[i]<x) i++;
19         while(a[j]>x) j--;
20         if(i<=j) std::swap(a[i++],a[j--]);
21     } while(i<=j);
22     if(l<=k&&k<=j) return find(l,j,k);
23     if(i<=k&&k<=r) return find(i,r,k);
24     return x;
25 }
26 int main() {
27     int n=getint(),k=getint();
28     for(register int i=1;i<=n;i++) {
29         a[i]=getint();
30     }
31     printf("%d
",find(1,n,k));
32     return 0;
33 }
原文地址:https://www.cnblogs.com/skylee03/p/7655791.html