快速选择——第K个数

注意:if判断条件是 if(l==r),判断此时是否只有一个数,是的话直接输出

此时 l=r,输出q[l] /q[r]都可以。


题目快速选择——第K个数_第1张图片

如果用快排来做,需要把所有的数都排序一下,这样做时间复杂度是 nlogn
快速选择 它的时间复杂度为 O(N)
回顾快排

快排步骤
1.找到分界点 x q[L], q[(L + R) / 2], q[Q]
2.左边所有数Left <= x, 右边所有数 Right >= x
3.递归排序左边 递归排序右边

现在求第k小的数,改造一下快排 

设左边数有SL个右边有SR个
1.k <= SL  k在左边 这个时候递归左边
2.k > SL, 所以第k小的数 一定在右边,这个时候递归右边,此时第K小的数为右边第K - SL小的数

代码如下: 

#include
using namespace std;
const int N = 100010;
int n, k;
int q[N];
int sort(int l, int r, int k)
{
	if (l == r)
		return q[l];
	int x = q[l];
	int i = l - 1, j = r + 1;
	while (i < j)
	{
		do i++;
		while (q[i] < x);
		do j--;
		while (q[j] > x);
		if (i < j)
			swap(q[i], q[j]);

	}
	int SL = j - l + 1;//右边的边界是j,左边是l,一共j-l+1个数
	if (k <= SL)
	return	sort(l, j, k);
   return sort(j + 1, r, k-SL);
}
int main()
{
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> q[i];
	cout<

 

 

你可能感兴趣的:(算法专栏,c++,蓝桥杯,开发语言)