求一个数组里面的第k小元素(Acwing)

1、输入一个数组,数组里有n个数,求第k 小元素(第k小个数)

2、先将数组进行快速排序

3、排序后划分两段,左段的元素个数为s1个,将s1与k进行比较大小,如果k 小于这个s1,则说明这个第k小元素是左段,在左端找到第k个元素即可。

4、如果在右端,即k大于s1,这个元素就是第k-s1个数(k的范围在这个数组内的各个地方均可)

#include<iostream>
using namespace std;

int n, k;//输入的个数为n,求第k小的元素
const int N = 1e6 + 10;
int q[N];//数组设定

int quick_sort(int l, int r, int k)//l与r分别为左右边界,K在l与r之间运动
{
	if (l == r)
		return q[l];//l==r表明只有一个数那么第k小的数就是他本身q[l]==q[r]

	int x = q[l];
	int i = l -1, j = r + 1;//定义双指针

	while (i < j)
	{
		while (q[++i] < x);
		while (q[--j] > x);
		if (i < j)
			swap(q[i], q[j]);
	}//快速排序

	int s1 = j - l+ 1;//分段,设s1为左段

	if (k <= s1)//k要小于等于s1
		return quick_sort(l, j, k);//左段

	return quick_sort(j + 1, r, k - s1);//省略了else的右半边
}
int main()
{
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> q[i];
	cout << quick_sort(0, n - 1, k) << endl;//直接输出这个第k小的数就ok啦!
	return 0;

}

之前错了,是在if(k<=s1)这里没有考虑等于,导致漏掉了一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值