第k个数【基础算法】

我们在上一篇基础算法已经讲了快排,在此基础上,今天来讲讲用快速选择找第k小的数该怎么做。(没看过快排那一篇的建议先看看)

目录

一、题目

二、思路

三、模板


一、题目

给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。

二、思路

先简单回顾一下快排的步骤:

第一步:确定一个分界点x(建议取中间数)

第二步:调整区间,让   x左边的数都<=x,   x右边的数都>=x.

第三步:递归处理左右两边

要找第k个数,利用上次讲的快排,只需在第三步时,再判断一下k在左边还是右边,然后递归处理k所在的那边即可。

三、模板

#include 
#include 
#include 
using namespace std;

const int N = 1000010;
int q[N];
int n, k;
int q_sort(int left, int right, int k)//注意k表示下标
{
	if (left >= right)return q[left];
	int i = left - 1;
	int j = right + 1;
	int x = q[(left + right)/2];
	while (i < j)
	{
		do i++; while (q[i] < x);
		do j--; while (q[j] > x);
		if (i < j)swap(q[i], q[j]);
	}
	if (k <= j)//k在左边
		return q_sort(left, j, k);
	else//k在右边
	{
		return q_sort(j + 1, right, k);
	}
}
int main()
{
	scanf("%d%d", &n, &k);
	for (int i = 0;i < n; i++)
	{
		scanf("%d", &q[i]);
	}
	int ret = q_sort(0, n - 1, k - 1);//要传过去的是下标,所以k-1
	printf("%d", ret);
	return 0;
}

你可能感兴趣的:(基础算法,算法,数据结构)