1. 程式人生 > 實用技巧 >洛谷-P1923 【深基9.例4】求第 k 小的數

洛谷-P1923 【深基9.例4】求第 k 小的數

洛谷-P1923 【深基9.例4】求第 k 小的數

原題連結:https://www.luogu.com.cn/problem/P1923


題目描述

輸入 \(n\)(\(n<5000000\)\(n\) 為奇數) 個數字 \(a_i(0<a_i<10^9)\) ,輸出這些數字的第 \(k\) 小的數。最小的數是第 0 小。

輸入格式

輸出格式

輸入輸出樣例

輸入 #1

5 1
4 3 2 1 5

輸出 #1

2

C++程式碼

#include <cstdio>
using namespace std;

int a[5000000];

int find_kth(int l, int r, int k) {
    int key = a[l];
    int low = l, high = r;
    while (high > low) {
        while (a[high] >= key && high > low)
            --high;
        a[low] = a[high];
        while (a[low] <= key && high > low)
            ++low;
        a[high] = a[low];
    }
    a[low] = key;
    if (k == low)
        return a[low];
    else if (k < low)
        return find_kth(l, low-1, k);
    else
        return find_kth(low+1, r, k);
}

int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    for (int i=0; i<n; ++i)
        scanf("%d", &a[i]);
    printf("%d\n", find_kth(0, n-1, k));
    return 0;
}