第X大的数
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
X最近爱上了区间查询问题,给出N (N <= 100000) 个数,然后进行M (M <= 50) 次询问,每次询问时,输入一个数X (1 <= X <= N),输出N个数中第X大的数。
Input
多组输入。
每组首先输入一个整数N,代表有N个数,下面一行包含N个整数,用空格隔开。然后为一个整数M,代表有M次询问,下面的M行,每行一个整数X。
Output
输出N个数中第X大的数。
Sample Input
4 1 2 2 3 4 1 2 3 4
Sample Output
3 2 2 1
#include <stdio.h>
#include <stdlib.h>
int a[100010] = {0};
int search(int *, int, int, int);
int main()
{
int i, n, m, x;
while(~scanf("%d", &n))
{
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &m);
while(m--)
{
scanf("%d", &x);
printf("%d\n", search(a, 1, n, x));
}
}
return 0;
}
int search(int *a, int l, int r, int x)
{
int key, i, j;
key = a[l];///此处要写 字母l !不要写成 数字1 !
i = l;
j = r;
while(i < j)
{
while(i < j && a[j] <= key)
j--;
a[i] = a[j];
while(i < j && a[i] >= key)
i++;
a[j] = a[i];
}
a[i] = key;
if(x == i) return a[i];
///若 x = i 则返回 a[i]
else if(x > i) return search(a, i + 1, r, x);
///若 x > i 则在右半区间递归查找 x
else return search(a, l, i - 1, x);
///若 x < i 则在左半区间递归查找 x
}