第k个数
题目
题目要求使用快速选择算法,找出第k小的数
快速选择算法
我们正常的思路是用快排先将数组排序,再抽出第k个数即可完成,但是快排的时间复杂度是o(nlogn)
我们有没有更快的方法呢?
我们可以想到在快排分段时,我们可以不用将两侧全部处理 只需要看我想要的那个数在哪一段里,只需要将那一段处理即可 这样时间复杂度就是o(n)
代码实现
int quick_select(int q[], int l, int r, int k)
{
if (l >= r)
return q[l];
int i = l - 1;
int j = r + 1;
int x = q[(l + r) / 2];
while (i < j)
{
while (q[++i] < x);
while (q[--j] > x);
if (i < j)
swap(q[i], q[j]);
}
//以上是快排思路
if ((j - l + 1) >= k)//如果k在左侧只处理左侧
return quick_select(q, l, j, k);
else//在右侧只处理右侧
return quick_select(q, j + 1, r, k - (j - l + 1));
}
int main()
{
int n = 0;
int k = 0;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%d", &q[i]);
}
int ret = quick_select(q, 0, n - 1, k);
printf("%d", ret);
return 0;
}
AC