题目链接:https://vjudge.net/problem/HihoCoder-1133/origin
输入
第1行:2个整数N,k。N表示数组长度,
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。
输出
第1行:一个整数t,表示t在数组中是第k小的数,若K不在数组中,输出-1。
Sample Input
10 4
1732 4176 2602 6176 1303 6207 3125 1 1011 6600
Sample Output
1732
思路一模板:非有序数组的二分查找
思路二:快速排序,快速查找;
int search(int left,int right){int ans=-1;while(left<=right){int w=rand()%(right-left+1)+left;swap(a[left],a[w]);int temp=a[left],tleft=left,tright=right;while(tleft<tright){while(tleft<tright&&a[tright]>=temp) tright--;a[tleft]=a[tright];while(tleft<tright&&a[tleft]<=temp) tleft++;a[tright]=a[tleft];}a[tleft]=temp;if(tleft==k){ ans=a[tleft];break;}else if(tleft>k) right=tleft-1;else left=tleft+1;}return ans;
}
完整代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxa=1e7+10;
int n,k;
int a[maxa];
void read(int &x){x=0;bool f=0;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=1;ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}x=f?(~x)+1:x;
}
int search(int left,int right){int ans=-1;while(left<=right){int w=rand()%(right-left+1)+left;swap(a[left],a[w]);int temp=a[left],tleft=left,tright=right;while(tleft<tright){while(tleft<tright&&a[tright]>=temp) tright--;a[tleft]=a[tright];while(tleft<tright&&a[tleft]<=temp) tleft++;a[tright]=a[tleft];}a[tleft]=temp;if(tleft==k){ ans=a[tleft];break;}else if(tleft>k) right=tleft-1;else left=tleft+1;}return ans;
}
int main(){read(n);read(k);for(int i=1;i<=n;i++)read(a[i]);printf("%d\n",search(1,n));
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxa=1e7+10;
int n,k;
int a[maxa];
void read(int &x){x=0;bool f=0;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=1;ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}x=f?(~x)+1:x;
}
int main(){read(n);read(k);for(int i=1;i<=n;i++)read(a[i]);sort(a+1,a+1+n);printf("%d\n",a[k]);
}