//本题用一个大小为k的大根堆即可解决
//遍历arr数组的每一个数,如果此时大根堆还没满就直接放入堆中,否则和大根堆的堆顶比较
//如果比堆顶要小则替换堆顶再重新调整成大根堆
//最后大根堆中的k个数就是数组中最小的k个数
#include<bits/stdc++.h>
using namespace std;
void heapInsert(int *heapArray,int data,int &heapSize);//建大根堆的函数
void heapfi(int *heapArray,int &heapSize);//重新调整成大根堆的函数
int main(){
int n,k;
cin>>n>>k;
int *arr=new int[n];
int *heapArray=new int[k];
int heapSize=0;//限制堆的大小
for(int i=0;i<n;i++){
cin>>arr[i];
//调整堆
if(heapSize<k){
heapInsert(heapArray, arr[i], heapSize);
}
else{//堆里面已经放满了,此时arr[i]如果比堆顶的值要小就交换堆顶的值,并重新调整堆
if(arr[i]<heapArray[0]){
heapArray[0]=arr[i];
heapfi(heapArray, heapSize);
}
else continue;
}
}
//最后大根堆里的k个数就是最小的k个数
for(int i=0;i<k;i++){
cout<<heapArray[i]<<" ";
}
delete []arr,heapArray;
return 0;
}
void heapInsert(int *heapArray,int data,int &heapSize)
{
heapArray[heapSize++]=data;//先将这个数放入大根堆中
//然后向上调整成大根堆,即和自己的父亲节点的值相比
int pos=heapSize-1;
while(heapArray[pos]>heapArray[(pos-1)/2]){//比他的父亲的值还要大,交换
int temp=heapArray[pos];
heapArray[pos]=heapArray[(pos-1)/2];
heapArray[(pos-1)/2]=temp;
pos=(pos-1)/2;//继续向上
}
}
//堆顶的值被替换成新的值了
//重新调整成大根堆
void heapfi(int *heapArray,int &heapSize)
{
int pos=0;
while(2*pos+1<heapSize){//当还有左孩子时
int max=2*pos+2>=heapSize||heapArray[2*pos+1]>heapArray[2*pos+2]?2*pos+1:2*pos+2;
if(heapArray[max]>heapArray[pos]){//孩子比父亲大
int temp=heapArray[max];
heapArray[max]=heapArray[pos];
heapArray[pos]=temp;
pos=max;//向下移动
}
else break;
}
}
//遍历arr数组的每一个数,如果此时大根堆还没满就直接放入堆中,否则和大根堆的堆顶比较
//如果比堆顶要小则替换堆顶再重新调整成大根堆
//最后大根堆中的k个数就是数组中最小的k个数
#include<bits/stdc++.h>
using namespace std;
void heapInsert(int *heapArray,int data,int &heapSize);//建大根堆的函数
void heapfi(int *heapArray,int &heapSize);//重新调整成大根堆的函数
int main(){
int n,k;
cin>>n>>k;
int *arr=new int[n];
int *heapArray=new int[k];
int heapSize=0;//限制堆的大小
for(int i=0;i<n;i++){
cin>>arr[i];
//调整堆
if(heapSize<k){
heapInsert(heapArray, arr[i], heapSize);
}
else{//堆里面已经放满了,此时arr[i]如果比堆顶的值要小就交换堆顶的值,并重新调整堆
if(arr[i]<heapArray[0]){
heapArray[0]=arr[i];
heapfi(heapArray, heapSize);
}
else continue;
}
}
//最后大根堆里的k个数就是最小的k个数
for(int i=0;i<k;i++){
cout<<heapArray[i]<<" ";
}
delete []arr,heapArray;
return 0;
}
void heapInsert(int *heapArray,int data,int &heapSize)
{
heapArray[heapSize++]=data;//先将这个数放入大根堆中
//然后向上调整成大根堆,即和自己的父亲节点的值相比
int pos=heapSize-1;
while(heapArray[pos]>heapArray[(pos-1)/2]){//比他的父亲的值还要大,交换
int temp=heapArray[pos];
heapArray[pos]=heapArray[(pos-1)/2];
heapArray[(pos-1)/2]=temp;
pos=(pos-1)/2;//继续向上
}
}
//堆顶的值被替换成新的值了
//重新调整成大根堆
void heapfi(int *heapArray,int &heapSize)
{
int pos=0;
while(2*pos+1<heapSize){//当还有左孩子时
int max=2*pos+2>=heapSize||heapArray[2*pos+1]>heapArray[2*pos+2]?2*pos+1:2*pos+2;
if(heapArray[max]>heapArray[pos]){//孩子比父亲大
int temp=heapArray[max];
heapArray[max]=heapArray[pos];
heapArray[pos]=temp;
pos=max;//向下移动
}
else break;
}
}