【洛谷 P1923】【深基9.例4】求第 k 小的数 题解(快速排序)

简介: 该题目要求输入一组不超过5000000个奇数个整数,并找出其中第k小的数,不使用`nth_element`函数,而是通过实现快速排序来解决。样例输入为5个数1, 4, 3, 2, 5,k=1,输出第1小的数即最小值2。代码中定义了快速排序函数`quickSort`和划分函数`partition`,并使用`read`函数读取输入。在主函数中对数组进行排序后输出第k个元素。

【深基9.例4】求第 k 小的数

题目描述

输入 $n$($1 \le n < 5000000$ 且 $n$ 为奇数)个数字 $a_i$($1 \le a_i < {10}^9$),输出这些数字的第 $k$ 小的数。最小的数是第 $0$ 小。

请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。

输入格式

输出格式

样例 #1

样例输入 #1

5 1
4 3 2 1 5

样例输出 #1

2

思路

先快速排序,然后通过数组索引访问第k小的数。由于数据过大,需要打开O2优化。

AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 5000005;
int a[maxn];

void read(int &x)
{
   
    char ch;
    x = 0;
    while (('0' > ch || '9' < ch))
    {
   
        ch = getchar();
    }
    while (!('0' > ch || '9' < ch))
    {
   
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}

int *particition(int a[], int *low, int *high)
{
   
    int *l = low, *r = high, pivot = *low;
    while (l < r)
    {
   
        while (l < r && *r > pivot)
        {
   
            r--;
        }
        while (l < r && *l <= pivot)
        {
   
            l++;
        }
        if (l < r)
        {
   
            swap(*(l++), *(r--));
        }
    }
    if (*l > pivot)
    {
   
        swap(*(l - 1), *low);
        return l - 1;
    }
    else
    {
   
        swap(*l, *low);
        return l;
    }
}

void quickSort(int a[], int *low, int *high)
{
   
    if (low < high)
    {
   
        int *mid = particition(a, low, high);
        quickSort(a, low, mid - 1);
        quickSort(a, mid + 1, high);
    }
}

int main()
{
   
    int n, k;
    read(n);
    read(k);
    for (int i = 0; i < n; i++)
    {
   
        read(a[i]);
    }
    quickSort(a, a, a + n - 1);
    /* for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    } */
    cout << a[k] << endl;
    return 0;
}
目录
相关文章
|
7月前
|
存储
LeetCode热题 首题 两数之和
LeetCode热题 首题 两数之和
45 1
|
6月前
|
机器学习/深度学习 算法 C++
【洛谷 P2240】【深基12.例1】部分背包问题 题解(贪心算法)
**深基12.例1**是部分背包问题,$N$堆金币,每堆$(m_i, v_i)$,$T$承重限制。按金币单价降序装包,保证价值最大化。输入$N,T$及每堆金币详情,输出两位小数的最大价值。示例:输入$4,50$,输出$240.00$。AC代码使用C++,通过排序和迭代实现。
76 0
|
6月前
|
机器学习/深度学习
【洛谷 P1271】【深基9.例1】选举学生会 题解(计数排序)
**深基9.例1**选举学生会,使用计数排序解决。给定$n$(≤999)候选人和$m$(≤2000000)选票,需按投票数排序选票。输入含$n$,$m$及$m$个候选人编号;输出排序后编号。示例:5名候选人,10张选票,输出`1 2 2 2 2 2 2 2 5 5`。代码:用数组记录每个候选人得票数,遍历数组打印每个候选人按票数的编号。
41 0
|
6月前
|
C++
【洛谷 P1706】全排列问题 题解(全排列)
该问题要求按字典序输出从1到n的所有不重复排列。输入为整数n,输出为每行一个的数字序列,每个数字占5个宽度。样例输入3,输出6行全排列。代码使用C++,通过`next_permutation`函数生成所有排列。注意n的范围是1到9。
53 0
|
6月前
|
算法 容器
【LeetCode刷题】三数之和、四数之和
【LeetCode刷题】三数之和、四数之和
|
7月前
|
机器学习/深度学习 算法 索引
leetcode热题100.两数之和
leetcode热题100.两数之和
37 1
|
7月前
|
算法
leetcode热题100.三数之和
leetcode热题100.三数之和
39 1
|
7月前
|
Java
leetcode-53:最大子序和
leetcode-53:最大子序和
41 0
|
测试技术 C++
力扣16-最接近的三数之和&力扣18-四数之和
力扣16-最接近的三数之和&力扣18-四数之和
86 0