AcWing 786:第k个数 ← 快速排序的应用

【题目来源】
https://www.acwing.com/problem/content/788/

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

【输入格式】
第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在 1∼10^9 范围内),表示整数数列。

【输出格式】
输出一个整数,表示数列的第 k 小数。

【数据范围】
1≤n≤100000 ,
1≤k≤n

【输入样例】
5 3
2 4 1 5 3

【输出样例】
3

【算法分析】
本题是快速排序算法的应用。即
在快速排序算法代码模板的基础上,微改
快速排序算法的模板可详见:

https://blog.csdn.net/hnjzsyjyj/article/details/132669946
下面两种实现,仅第9行代码不同。

【算法代码一:
序列中间位置元素为基准值

#include 
using namespace std;
 
const int maxn=1e5+5;
int v[maxn];

int quicksort(int le, int ri, int p) {
    if(le==ri) return v[le];
    int mid=v[le+ri>>1];
    
    int i=le-1;
    int j=ri+1;
    while(imid);
        if(i>n>>k;
    for(int i=0; i


【算法代码二:序列首部位置元素为基准值

#include 
using namespace std;
 
const int maxn=1e5+5;
int v[maxn];

int quicksort(int le, int ri, int p) {
    if(le==ri) return v[le];
    int mid=v[le];
    
    int i=le-1;
    int j=ri+1;
    while(imid);
        if(i>n>>k;
    for(int i=0; i



【参考文献】
https://www.acwing.com/solution/content/7585/
https://www.acwing.com/solution/content/175833/



 

你可能感兴趣的:(信息学竞赛,#,排序与查找,快速排序)