Description
于给定n个元素的数级a[1…n],要从中找出第k小的元素。
Input
第一行是总数n和k,第二行是n个待比较的数。
Output
第K小数的位置。
Sample Input
5 3
23 8 91 56 4
Sample Output
1
思路
结构体+快排思想的分治
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
using namespace std;
long long a[100001],id[100001];
long long n,k;
void f(long long l,long long r)
{
long long i=l,j=r,key=a[(l+r)>>1];
do
{
while (key<a[j]) j--;
while (key>a[i]) i++;
if (i<=j) swap(a[i],a[j]),swap(id[i],id[j]),i++,j--;
}while (i<=j);
if (k<=j) f(l,j);
else if (i<=k) f(i,r);
else cout<<id[j+1];
return;
}
int main()
{
cin>>n>>k;
k--;
for (long long i=0;i<n;i++) cin>>a[i],id[i]=i+1;
f(0,n-1);
return 0;
}