在快速排序的过程中进行操作,快速排序定下的某个数排序结束之后可以得到当前数是第几个数,然后根据得到的第几个数可以进行向左还是向右的调整。
可以省略掉一些不必要的操作。
#include <bits/stdc++.h> using namespace std; const int maxn = 5e6+10; int a[maxn]; int k; inline int read() { int x=0, f=1; char ch = getchar(); while (ch<'0'||ch>'9') { if (ch == '-') f = -f; ch = getchar(); } while (ch >= '0' && ch<='9') { x = (x<<1) + (x<<3) + (ch^48); ch = getchar(); } return x*f; } int quick_find(int l, int r) { if (l==r) return a[l]; int i=l, j=r; int temp = a[(i+j)/2]; while (i<=j) { while (a[i]<temp) i++; while (a[j]>temp) j--; if (i<=j) { swap(a[i], a[j]); i++; j--; } } if (k<=j) return quick_find(l, j); else if (k>=i) return quick_find(i, r); else return a[k]; } int main() { int T; T = read(); while (T--) { int n = read(); k = read(); for (int i=1;i<=n;i++) { a[i] = read(); } cout<<quick_find(1, n)<<endl; } return 0; }