堆排序(c语言入门版)

### 题目描述

输入一个长度为 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]); 
}
```
通俗来讲 堆排序就是将一些数据将其最大(小)的的数不断计算出来并且归为已排序 
----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值