题目的主要信息:
题目比较简单,就是输入n个整数,按从小到大的顺序输出其中最小的k个整数。
方法一:快速排序
用一个vector存储这n个整数,然后用sort对这个n个数进行排序,默认排序完是升序,我们输出前k个数字即可。sort排序使用的快速排序。
具体做法:
#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;
}
复杂度分析:
- 时间复杂度:,sort排序默认是快速排序。
- 空间复杂度:,只用了常数空间。
方法二:选择排序
除了方法一的快速排序,我们还可以用选择排序,使用选择排序的理由是,选择排序每一轮都会选出最小值,我们只要选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;
}
复杂度分析:
- 时间复杂度:,遍历数组选出最小值,需要遍历k次。
- 空间复杂度:,只用了常数空间。