【深基9.例4】求第 k 小的数
题目描述
输入 nnn(1≤n<50000001 \le n < 50000001≤n<5000000 且 nnn 为奇数)个数字 aia_iai(1≤ai<1091 \le a_i < {10}^91≤ai<109),输出这些数字的第 kkk 小的数。最小的数是第 000 小。
请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。
输入格式
输出格式
样例 #1
样例输入 #1
5 1
4 3 2 1 5
样例输出 #1
2
注意点
1.快排、找第k小数代码类似
找第k小数就是先快排一次,再分区间去找
2.下面的代码第k小数是从0开始
#include<iostream>
using namespace std;
const int N = 5000010;
int a[N];
int n,k;
int quick_sort(int l,int r,int k)
{
if(l >= r) return a[k];
int x = a[l + r >> 1],i = l - 1,j = r + 1;
while(i < j)
{
do i ++; while(a[i] < x);
do j --; while(a[j] > x);
if(i < j) swap(a[i],a[j]);
}
if(k <= j) return quick_sort(l,j,k);
else return quick_sort(j + 1,r,k);
}
int main()
{
scanf("%d %d",&n,&k);
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
int ans = quick_sort(0,n - 1,k);
printf("%d",ans);
return 0;
}
//快排,y总的模板
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + 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]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r); //左右递归
使用分治法实现快速排序求第k小数的C++代码示例,
本文介绍了如何在C++中不使用nth_element函数,而是通过分治算法(快速排序)实现找出给定数字序列中第k小的数。代码给出了样例输入和输出,并强调了快速排序的过程和注意事项。
508

被折叠的 条评论
为什么被折叠?



