求第k小的数 - 题解

求第k小的数

时间限制:C/C++ 1500MS,其他语言 3000MS
内存限制:C/C++ 256MB,其他语言 512MB

描述

输入 \(n\) 个数字,输出这些数字的第 \(k\) 小的数。最小的数是第 \(0\) 小。

输入描述

第一行包含两个整数 \(n(1≤n≤5000000)\)\(k(0≤k<n)\)

输出描述

1 个整数(所有整数均在 \(1∼10^9\) 范围内)。

用例输入 1

5 1
4 3 2 1 5

用例输出 1

2

提示

请不要 nth_element() 函数。

代码

#include<cstdio>
#include<algorithm>
using namespace std;

inline int read()
{
	int x=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') x=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+(ch^'0');
		ch=getchar();
	}
	return x*w;
}

const int N=5e6+5;
int n,k,a[N];

int QuickSort_FindNth(int l,int r,int nth)
{
	if(l>=r) return a[l];
	int i=l-1,j=r+1, p=a[(l+r)>>1];
	while(i<j)
	{
		do i++; while(a[i]<p);
		do j--; while(a[j]>p);
		if(i<j) swap(a[i],a[j]);
	}
	if(nth<=j) return QuickSort_FindNth(l,j,nth);
	else return QuickSort_FindNth(j+1,r,nth);
}

int main()
{
	n=read(),k=read();
	for(int i=1;i<=n;i++) a[i]=read();
	printf("%d\n",QuickSort_FindNth(1,n,k+1));
	return 0;
}
posted @ 2024-07-29 23:26  Jerrycyx  阅读(24)  评论(0编辑  收藏  举报