思路:
对输入的数据进行升序堆排序,排序后输出前k个值即可。
代码:
#include<bits/stdc++.h>
using namespace std;
void AdjustDown(vector<int>& A, int k, int len){
A[0] = A[k];
for (int i = 2 * k; i <= len; i*=2){
if(i<len && A[i] < A[i+1]){
i++;
}
if(A[0]>=A[i]){
break;
}else{
A[k] = A[i];
k = i; // 更新需要调整的节点
}
}
A[k] = A[0];
}
void BuildMaxHeap(vector<int>& A,int len){
for (int i = len / 2; i > 0; i--){
AdjustDown(A, i, len);
}
}
void swap(int &a,int &b){
int tmp = a;
a = b;
b = tmp;
}
void HeapSort(vector<int>& A,int len){
BuildMaxHeap(A, len);
for (int i = len; i > 1; i--){
swap(A[i], A[1]);
AdjustDown(A, 1, i - 1);
}
}
int main(){
int n,k,i;
while(cin>>n>>k){
vector<int>arr;
arr.push_back(0);
int num;
for(i=1;i<=n;i++){
cin>>num;
arr.push_back(num);
}
HeapSort(arr, arr.size() - 1);
for(i=1;i<k;i++){
cout<<arr[i]<<" ";
}
cout<<arr[i]<<endl;
}
return 0;
}