思路:

对输入的数据进行升序堆排序,排序后输出前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;
}