1574.求第k小数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
求第k小数
输入
先输入一个小于10000的正整数n,再输入n个整数,最后输入一个小于等于n的正整数k,
输出
输出其中第k小的数。
输入样例
5
2 98 34512 8492 1000
2
输出样例
98
提示
来源
/*
思路:可以采用二分法思想,先让一个数顺序归位。
如果要找的数的下标比这个数的下标大,则从这个数的左边找
如果要找的数的下标比这个数小,则在这个数左边找
依次递归
*/
#include<iostream>
using namespace std;
int a[10005],n,k;
int findk(int left,int right){
int i = left,j = right,temp = a[left];
while(i < j){
while(i < j&&a[j] >= temp){
j--;
}
a[i] = a[j];
while(i < j&&a[i] <= temp){
i++;
}
a[j] = a[i];
}
a[i] = temp;
if(i == k){
return a[i];
}else if(i < k){
findk(i+1,right);
}else{
findk(left,i-1);
}
}
int main(){
// freopen("input.txt","r",stdin);
int i;
cin>>n;
for(i = 1;i <= n;i++){
cin>>a[i];
}
cin>>k;
cout<<findk(1,n)<<endl;
}