利用分治算法的时间复杂度为O(nlogn)
当n<-10^4时可直接冒泡排序找(更省时间)
当n>10^4时 (利用分治找更省时间)
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
#define MAXN 100100
int a[MAXN];
int QKPass(int low, int high) //一趟快速排序,找一个中值
{
int x=a[low];
while(low<high)
{
while(low<high&&a[high]>=x)
--high;
a[low]=a[high];
while(low<high&&a[low]<=x)
{
++low;
}
a[high]=a[low];
}
a[low]=x;
return low; //low恰好是中值的位置
}
int solve(int left,int right,int k)
{
int temp=QKPass(left,right);
if(k>temp) return solve(temp+1,right,k);
else if(k==temp)
return a[temp];
else if(k<temp) return solve(left,temp-1,k);
}
int main()
{
int n,k;
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
printf("%d\n", solve(1,n,k));
return 0;
}