最小堆 (小顶堆)

最小堆:

父结点小于子结点的完全二叉树

操作:

每次插入数据都插在层序的下一个空位,插入后如果比父结点小就上浮

代码

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

int n;
int tree[2009];//树 
int pos[2009];//每个数的位置 
void order(int x){//最小堆 
    if(x==1)return;
    if(tree[x]<tree[x>>1]){//比父亲小就上浮,改成>就是最大堆 
        swap(pos[tree[x]],pos[tree[x>>1]]);
        swap(tree[x],tree[x>>1]);
        order(x>>1);
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int mid;scanf("%d",&mid);
        tree[i]=mid;pos[mid]=i;//往下一个空填充 
        order(i);
    }
    for(int i=1;i<=50;i++){//层序遍历
        if(tree[i])cout<<tree[i]<<' ';
    } 
        cout<<endl;
} 
/*
5
46 23 26 24 10
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值