#include <iostream>
#include <cstdlib>
#include <ctime>
#define M 100
using namespace std;
int min_kth(int a[],int begin,int end,int k);
int func(int a[],int begin,int end,int k);
int partition(int a[],int begin,int end);
int main()
{
int a[M];
int n;
cin>>n>>m;
srand((time(NULL)));
for (int i=0;i<n;i++)
{
a[i]=rand()%100;
cout<<a[i]<<" ";
}
cout<<endl;
cout<<min_kth(a,0,n,m)<<endl;
return 0;
}
int partition(int a[],int begin,int end)
{
int temp=a[begin];
int b=begin,e=end;
while (1)
{
while(b+1<end && a[++b]<temp);
while(a[--e]>temp);
if(b<e)
swap(a[b],a[e]);
else
break;
}
swap(a[e],a[begin]);
return e;
}
int func(int a[],int begin,int end,int k)
{
//应当先划分在判断
int t=partition(a,begin,end);
if(t==k)
return a[t];
if(t>k)
return func(a,begin,t,k);
else
//从下b+1开始,从而避免类似二分查找常出现的死循环的错误
return func(a,t+1,end,k);
}
int min_kth(int a[],int begin,int end,int k)
{
if(k>end-begin)
return -1;
return func(a,begin,end,begin+k-1);
}
存在问题:这样的操作会改变原数组的内容,因而多次查询可能会出现错误。