最小堆:
父结点小于子结点的完全二叉树
操作:
每次插入数据都插在层序的下一个空位,插入后如果比父结点小就上浮
代码
#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
*/