求一串数中的第k大的数。
分治思想
复杂度O(N)。
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 1000005
int a[N];
int qselect(int * a, int s, int e, int k)
{
int mid = a[s + (e - s) / 2];
int i = s, j = e - 1;
while(i <= j){
while(a[i] < mid) ++i;
while(a[j] > mid) --j;
if(i <= j){
swap(a[i], a[j]);
++i;--j;
}
}
if(s <= j && k <= j) return qselect(a, s, j + 1, k);
if(i < e && k >= i) return qselect(a, i, e, k);
return a[k];
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
printf("%d\n", qselect(a, 0, n, n / 2));
return 0;
}