查找第k个数
给定一个长度为n的整数列,以及一个整数k,用快速选择算法求出数列第k小的数
使用快排的思想,在快排递归步骤进行判断,只递归k所在区间,时间复杂度为2n
#include <iostream>
using namespace std;
const int N = 100010;
int p[N], n, k;
int quick_sort(int l, int r, int k)
{
if(l == r) return p[l];
int x = p[(l + r + 1)/2], i = l - 1, j = r + 1;
while(i < j)
{
while(p[++i] < x);
while(p[--j] > x);
if(i < j) swap(p[i], p[j]);
}
int sl = i - l;
if(k <= sl) return quick_sort(l, i - 1, k);
return quick_sort(i, r, k - sl);
}
int main()
{
scanf("%d %d", &n, &k);
for(int i = 0; i < n; i++) scanf("%d", &p[i]);
printf("%d", quick_sort(0, n - 1, k));
}