每排完一次后,由于基准数的左右都完成了相对大小的排列,可以把基准数的序号与k进行比较,如果不是,则判断进入左半部分或者右半部分,平均情况下时间复杂度为O(n)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+5;
int a[N];
int n,k;
int quicksort(int l,int r) {
if(l<r) {
int temp = a[l];
int i = l ,j = r;
while(i<j) {
while(i<j&&a[j]>=temp)
j--;
if(i<j)
a[i] = a[j];
while(i<j&&a[i]<=temp) {
i++;
}
if(i<j)
a[j] = a[i];
}
a[i] = temp;
if(i == k) {
return a[i];
}
else if(i>k)
quicksort(l,i-1);
else
quicksort(i+1,r);
}
}
int main() {
cin >> n >> k;//n个元素,第k小数
for(int i=1;i<=n;i++)
cin >> a[i];
int num = quicksort(1,n);
cout << num << endl;
return 0;
}