尽人事,听天命。|

Jerrycyx

园龄:2年9个月粉丝:2关注:1

2024-07-29 23:26阅读: 35评论: 0推荐: 0

求第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 @   Jerrycyx  阅读(35)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起