P1923 【深基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

i先动,会遗留一个大于等于基准值的
j先动,会遗留个小于等于基准值的
所以如果最后要和左边的基准值交换,则要j先动
否则i先动

#include <bits/stdc++.h>
#include <cstdio>
using namespace std;

int n, k; // n 个数,查找第 k 小的数
int q[5000005];

// 快速选择算法
int quick_select(int l, int r) {
    if (l >= r) return q[l]; // 如果只有一个元素,直接返回

    // 分区
    int i = l, j = r;
    while (i < j) {
        while (i < j && q[j] >= q[l]) j--;
        while (i < j && q[i] <= q[l]) i++; 
        swap(q[i], q[j]);
    }
    swap(q[i], q[l]);
    // 判断 k 在哪个区间
    if (k == i) return q[i]; 
    if (k < i) return quick_select(l, i-1);
    return quick_select(i + 1, r);
}

int main() {
    cin >> n >> k;
    for(int i=0;i<n;i++)
        scanf("%d",q+i);

    printf("%d",quick_select(0, n - 1));

    return 0;
}
posted @ 2025-03-07 18:37  丘狸尾  阅读(30)  评论(0)    收藏  举报