题目3:第k小的数

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

输入格式

第一行包含两个整数n和k

第二行包含n个整数,表示整数数列。

输出格式

输出一个整数,表示数列的第k小数。

数据范围

1≤n≤100000

1≤k≤n

输入样例:

5 3
2 4 1 5 3

输出样例:

3 

代码:

 

#include<iostream>
#include<vector>
using namespace std;

int func(vector<int>& vec, int start, int end, int k)
{
    if (start == end)
    {
        return vec[start];
    }
    if (start < end)
    {
        //将原问题分解为子问题A和子问题B
        int i = start;
        int j = end;
        int tmp = vec[i];
        while (i < j)
        {
            while (i < j && vec[j] >= tmp)
            {
                j--;
            }
            if (i < j)
            {
                vec[i] = vec[j];
                i++;
            }
            while (i < j && vec[i] < tmp)
            {
                i++;
            }
            if (i < j)
            {
                vec[j] = vec[i];
                j--;
            }
        }
        vec[i] = tmp;
        int sl = i - start + 1;

        //对子问题A进行递归分解
        if (k <= sl)
        {
            return func(vec, start, i, k);
        }
        //对子问题B进行递归分解
        return func(vec, i + 1, end, k - sl);
    }
}

int main()
{
    int n;
    cin >> n;
    int k;
    cin >> k;
    vector<int> vec;
    for (int i = 0; i < n; i++)
    {
        int tmp;
        cin >> tmp;
        vec.push_back(tmp);
    }
    cout << func(vec, 0, vec.size() - 1, k) << endl;
}

 

posted on 2022-09-19 17:29  yc-limitless  阅读(83)  评论(0)    收藏  举报