题目的主要信息:

题目比较简单,就是输入n个整数,按从小到大的顺序输出其中最小的k个整数。

方法一:快速排序

用一个vector存储这n个整数,然后用sort对这个n个数进行排序,默认排序完是升序,我们输出前k个数字即可。sort排序使用的快速排序。 alt

具体做法:

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

int main(){
    int n,k;
    while(cin>>n>>k){//输入n和k
        vector<int> num;
        for(int i=0;i<n;i++){//逐个储存n个整数
            int temp;
            cin>>temp;
            num.push_back(temp);
        }
        sort(num.begin(),num.end());//对n个数进行升序排序
        for(int i=0;i<k-1;i++){//输出前k个数字
            cout<<num[i]<<' ';
        }
        cout<<num[k-1]<<endl;//最后一个数字输出后不要输出空格了
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(nlog2n)O(nlog_2n),sort排序默认是快速排序。
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:选择排序

除了方法一的快速排序,我们还可以用选择排序,使用选择排序的理由是,选择排序每一轮都会选出最小值,我们只要选k次,就能得到n个整数中最小的k个数字。

具体做法:

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

int main(){
    int n,k;
    while(cin>>n>>k){//输入n和k
        vector<int> num;
        for(int i=0;i<n;i++){//逐个储存n个整数
            int temp;
            cin>>temp;
            num.push_back(temp);
        }
        for(int i=0;i<k;i++){//选择排序,只要选出前k个
            int min=num[i];
            int pos=i;
            for(int j=i+1;j<n;j++){//遍历一遍,从中选出最小值
                if(num[j]<min){
                    min=num[j];
                    pos=j;
                }
            }
            num[pos]=num[i];//把最小值交换到前面
            num[i]=min;
        }
        for(int i=0;i<k-1;i++){//输出前k个数
            cout<<num[i]<<' ';
        }
        cout<<num[k-1]<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(kn)O(kn),遍历数组选出最小值,需要遍历k次。
  • 空间复杂度:O(1)O(1),只用了常数空间。