【快速排序选择】第k个数-CSDN博客

66 阅读1分钟

第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