Eleven_ZD @ 2024-03-10 23:25:13
//代码操作逻辑:选取输入序列中间数作为基准量,从两边向中间遍历
#include<bits/stdc++.h>
using namespace std;
void find_k(vector<int>& arr, int l, int r, int k)
{
if (l >= r) return;
int mid = arr[(l + r) / 2];
int m = (l + r) / 2;//中间值下标
int i = l;
int j = r;
while (i < j)
{
//从右边开始遍历
while (i < j && arr[j] >= mid) j--;
if (arr[j] < mid)
{
swap(arr[j], arr[m]);
m = j;
j--;
}
// 从左边开始遍历
while (i < j && arr[i] <= mid) i++;
if (arr[i] > mid)
{
swap(arr[i], arr[m]);
m = i;
i++;
}
}
if (k < m) find_k(arr, l, m - 1, k); //k在左子序列
else if (k > m) find_k(arr, m + 1, r, k); //k在右子序列
else return;
}
int main ()
{
int n,k;
scanf("%d%d",&n,&k);
vector<int> arr(n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
find_k(arr,0,n-1,k);
printf("%d",arr[k]);
return 0;
}