C++ 查找数组中第k小的数

本文介绍了一种求解整数数组中第k小数的算法。通过不断比较和更新包含k个元素的辅助数组,确保其始终保存数组中最小的k个数,最后输出辅助数组的最大值即为所求。此算法适用于数据规模较小的情况。
/**
题目描述
给定一个整数数组a[0,...,n-1],求数组中第k小数

输入描述
首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n
然后输出n个整形元素,每个数的范围[1, 5000]

输出描述
该数组中第k小数

样例输入
4 2
1 2 3 4

样例输出
2
**/
#include<iostream>
using namespace std;

int main(){
    int n,k;
    cin>>n>>k;
    int a[n];
    int b[k];
    for(int i=0;i<k;i++){
        b[i]=5001;
    }
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int i=0;
    while(i<n){
        //cout<<i<<endl;
        for(int j=0;j<k;j++){
            if(b[j]>=a[i]){
                // then a[i] should be at the j-th pos in array b
                // the element after the j-th pos in array-b will be moved forward one step
                // 如果在数组b中找到b[j]大于a[i],则a[i]的数值应该被放置到数组b的第j个位置上
                // 并且数组b的第j个位置中的元素应该依次顺序向后移动一位

                /** 值得注意的是,这里并不出需要去重,如果在原始数组a中具有相同的元素,则它们将在数组b中重复出现 **/

                for(int p=k-1;p>j;p--){
                    // 实现覆盖
                    b[p]=b[p-1];
                }
                b[j]=a[i];
                break;
            }
            // 如果数组b中的所有元素都比a[i]小或者等于a[i]
            // 则当前的a[i]元素对于更新数组b是没有作用的,故而跳出此次遍历,继续向后读取下一个a[i]元素
        }
        i+=1;
        //
    }
    cout<<b[k-1]<<endl;
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值