### 题目描述
输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。
### 输入格式
共一行,包含 m 个整数,表示整数数列中前 m 小的数。
#### 输入样例
```
5 3
4 5 1 3 2
```
#### 输出样例
```
1 2 3
```
----------
### 预备知识(完全二叉树 大小根堆)
概念不清的可以去某b站看看几分钟的视频
这里给出父子节点关系 此题代码会用到
子结点=2*父节点+1
##### (堆排序) $O(nlong(n)$
###代码(c语言入门代码)只会c/苦涩
```
#include <stdio.h>
const int N=1e5+5;
int num[N];
void swap(int *p1,int *p2){
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}//swap函数入门函数了 注意形参和实参的区别就好
void sort(int num[],int n,int pi)//将n个数排序成大根堆
{
int si=pi*2+1;
while (si<n){
if (si+1<n&&num[si+1]>num[si]){
si++;
}//这里是寻找俩个子节点哪个较大 将更大的数跟其父节点交换 交换到满足大根堆的条件为止
if (num[si]>num[pi]){
swap(&num[si],&num[pi]);
pi=si;
si=pi*2+1;
}
else break;
}
}
void HeapSort(int num[],int n){
for(int i=(n-2)/2;i>=0;i--){
sort(num,n,i);
}
int end=n-1;
while (end>0){
swap(&num[0], &num[end]);//将大根堆堆顶即最大的数与最后一个数交换,并归为已排序好的数据
sort(num,end,0);
end--;
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
HeapSort(num, n);
for(int i=0;i<m;i++) printf("%d ",num[i]);
}
```
通俗来讲 堆排序就是将一些数据将其最大(小)的的数不断计算出来并且归为已排序
----------